4

I am using Akka-Http to make a rest server and i want to log requests and results, however I'm getting an exception whenever i try to do runReduce on the response entity. The exception says java.lang.NullPointerException: Deflater has been closed. The exception does not prevent me from logging the body, but i only get gibberish in the log: ��]D�O!�c�?�%{�GY\��>������t. Can someone explain why this is happening? I suspect its because the stream that stores the response-body is closed or not opened but i don't know how to solve it.

The set-up for logging is shown below. The logging happens in the logResponse-method inside RequestResponseLogWriter. I use akkas own directives for getting the request and response entities. Logging is done with slf4j.

trait RouteBuilder extends Directives {

  val logWriter = new RequestResponseLogWriter()

  val routes: Route =
    extractRequestContext { context =>
      logRequestResult(LoggingMagnet(_ => logWriter.responseLogging(context))) {
        ComponentRegistry.searchRestApi.routes
      }
    }
}


class RequestResponseLogWriter extends LazyLogging {
  val responseLogging = (context: RequestContext) => (request: HttpRequest) =>
                        (result: RouteResult) =>
    result match {
      case RouteResult.Complete(response) => logResponse(context, request, response)
      case RouteResult.Rejected(_) =>
    }

  private def logResponse(context: RequestContext, request: HttpRequest, 
                          response: HttpResponse): Unit = {
    implicit val ec: ExecutionContext = context.executionContext
    implicit val mat: Materializer = context.materializer
    response.entity.dataBytes.runReduce(_ ++ _)
      .foreach(bytes => logger.info(s"Body ${bytes.utf8String}"))
  }
}
Eirik Thon
  • 91
  • 5

0 Answers0