diff --git a/finagle-backend/src/main/scala/sttp/client4/finagle/FinagleBackend.scala b/finagle-backend/src/main/scala/sttp/client4/finagle/FinagleBackend.scala index 3464c408d..a0afb9fd7 100644 --- a/finagle-backend/src/main/scala/sttp/client4/finagle/FinagleBackend.scala +++ b/finagle-backend/src/main/scala/sttp/client4/finagle/FinagleBackend.scala @@ -49,7 +49,11 @@ class FinagleBackend(client: Option[Client] = None) extends Backend[TFuture] { val statusText = fResponse.status.reason val responseMetadata = ResponseMetadata(code, statusText, headers) val body = - bodyFromResponseAs(request.options.onBodyReceived)(request.response, responseMetadata, Left(fResponse)) + bodyFromResponseAs(() => request.options.onBodyReceived(responseMetadata))( + request.response, + responseMetadata, + Left(fResponse) + ) service .close() .flatMap(_ => body.map(sttp.client4.Response(_, code, statusText, headers, Nil, request.onlyMetadata))) diff --git a/http4s-ce2-backend/src/main/scala/sttp/client4/http4s/Http4sBackend.scala b/http4s-ce2-backend/src/main/scala/sttp/client4/http4s/Http4sBackend.scala index 5d8624ff9..078216d1c 100644 --- a/http4s-ce2-backend/src/main/scala/sttp/client4/http4s/Http4sBackend.scala +++ b/http4s-ce2-backend/src/main/scala/sttp/client4/http4s/Http4sBackend.scala @@ -85,11 +85,9 @@ class Http4sBackend[F[_]: ConcurrentEffect: ContextShift]( val statusText = response.status.reason val responseMetadata = ResponseMetadata(code, statusText, headers) - val callbackResponse = - response.copy(body = response.body.onFinalize(ConcurrentEffect[F].delay(r.options.onBodyReceived()))) val limitedResponse: org.http4s.Response[F] = r.options.maxResponseBodyLength - .fold(callbackResponse)(limit => response.copy(body = limitBytes(callbackResponse.body, limit))) + .fold(response)(limit => response.copy(body = limitBytes(response.body, limit))) val signalBodyComplete = responseBodyCompleteVar.tryPut(()).map(_ => ()) val body = @@ -98,7 +96,10 @@ class Http4sBackend[F[_]: ConcurrentEffect: ContextShift]( responseMetadata, Left( onFinalizeSignal( - decompressResponseBodyIfNotHead(r.method, limitedResponse, r.autoDecompressionEnabled), + addOnBodyReceivedCallback( + decompressResponseBodyIfNotHead(r.method, limitedResponse, r.autoDecompressionEnabled), + () => r.options.onBodyReceived(responseMetadata) + ), signalBodyComplete ) ) @@ -195,6 +196,9 @@ class Http4sBackend[F[_]: ConcurrentEffect: ContextShift]( private def onFinalizeSignal(hr: http4s.Response[F], signal: F[Unit]): http4s.Response[F] = hr.copy(body = hr.body.onFinalize(signal)) + private def addOnBodyReceivedCallback[T](hr: http4s.Response[F], callback: () => Unit): http4s.Response[F] = + hr.copy(body = hr.body.onFinalize(ConcurrentEffect[F].delay(callback()))) + private def decompressResponseBodyIfNotHead[T]( m: Method, hr: http4s.Response[F],