From 80e6ecb69eba5c422f66cde99bb298582c7f3229 Mon Sep 17 00:00:00 2001 From: hdfg159 Date: Fri, 17 May 2024 20:18:49 +0800 Subject: [PATCH] http2client should not cache the InputStream eg:HTTP 1.1 Chunked_transfer_encoding (#2420) --- .../main/java/feign/http2client/Http2Client.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/java11/src/main/java/feign/http2client/Http2Client.java b/java11/src/main/java/feign/http2client/Http2Client.java index 9ebb8c818..11eec92b0 100644 --- a/java11/src/main/java/feign/http2client/Http2Client.java +++ b/java11/src/main/java/feign/http2client/Http2Client.java @@ -22,8 +22,8 @@ import feign.Request.ProtocolVersion; import feign.Response; import feign.Util; -import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.URI; import java.net.URISyntaxException; @@ -97,9 +97,9 @@ public Response execute(Request request, Options options) throws IOException { } HttpClient clientForRequest = getOrCreateClient(options); - HttpResponse httpResponse; + HttpResponse httpResponse; try { - httpResponse = clientForRequest.send(httpRequest, BodyHandlers.ofByteArray()); + httpResponse = clientForRequest.send(httpRequest, BodyHandlers.ofInputStream()); } catch (final InterruptedException e) { Thread.currentThread().interrupt(); throw new IOException(e); @@ -119,19 +119,17 @@ public CompletableFuture execute( } HttpClient clientForRequest = getOrCreateClient(options); - CompletableFuture> future = - clientForRequest.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofByteArray()); + CompletableFuture> future = + clientForRequest.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream()); return future.thenApply(httpResponse -> toFeignResponse(request, httpResponse)); } - protected Response toFeignResponse(Request request, HttpResponse httpResponse) { + protected Response toFeignResponse(Request request, HttpResponse httpResponse) { final OptionalLong length = httpResponse.headers().firstValueAsLong("Content-Length"); return Response.builder() .protocolVersion(enumForName(ProtocolVersion.class, httpResponse.version())) - .body( - new ByteArrayInputStream(httpResponse.body()), - length.isPresent() ? (int) length.getAsLong() : null) + .body(httpResponse.body(), length.isPresent() ? (int) length.getAsLong() : null) .reason(httpResponse.headers().firstValue("Reason-Phrase").orElse(null)) .request(request) .status(httpResponse.statusCode())