diff --git a/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java index 4c9bef04a6f..5ae62cbadaa 100644 --- a/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java @@ -112,7 +112,7 @@ class JdkClientHttpRequest extends AbstractStreamingClientHttpRequest { TimeoutHandler timeoutHandler = null; try { HttpRequest request = buildRequest(headers, body); - responseFuture = this.httpClient.sendAsync(request, new DecompressingBodyHandler()); + responseFuture = this.httpClient.sendAsync(request, this.compression ? new DecompressingBodyHandler() : HttpResponse.BodyHandlers.ofInputStream()); if (this.timeout != null) { timeoutHandler = new TimeoutHandler(responseFuture, this.timeout); diff --git a/spring-web/src/test/java/org/springframework/http/client/AbstractMockWebServerTests.java b/spring-web/src/test/java/org/springframework/http/client/AbstractMockWebServerTests.java index 7730e95c212..9fbef5328d4 100644 --- a/spring-web/src/test/java/org/springframework/http/client/AbstractMockWebServerTests.java +++ b/spring-web/src/test/java/org/springframework/http/client/AbstractMockWebServerTests.java @@ -116,29 +116,26 @@ public abstract class AbstractMockWebServerTests { String encoding = request.getTarget().replace("/compress/",""); String requestBody = request.getBody().utf8(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - if (encoding.equals("gzip")) { - try(GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) { - gzipOutputStream.write(requestBody.getBytes()); - gzipOutputStream.flush(); - } - } - else if(encoding.equals("deflate")) { + if(encoding.equals("deflate")) { try(DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(outputStream)) { deflaterOutputStream.write(requestBody.getBytes()); deflaterOutputStream.flush(); } } + // compress anyway with gzip else { - outputStream.write(requestBody.getBytes()); + encoding = "gzip"; + try(GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) { + gzipOutputStream.write(requestBody.getBytes()); + gzipOutputStream.flush(); + } } Buffer buffer = new Buffer(); buffer.write(outputStream.toByteArray()); MockResponse.Builder builder = new MockResponse.Builder() .body(buffer) .code(200); - if (!encoding.isEmpty()) { - builder.setHeader(HttpHeaders.CONTENT_ENCODING, encoding); - } + builder.setHeader(HttpHeaders.CONTENT_ENCODING, encoding); return builder.build(); } return new MockResponse.Builder().code(404).build(); diff --git a/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java b/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java index 2d9a9c32a11..c64782f9f64 100644 --- a/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java +++ b/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java @@ -110,12 +110,18 @@ class JdkClientHttpRequestFactoryTests extends AbstractHttpRequestFactoryTests { @Test void compressionDisabled() throws IOException { URI uri = URI.create(baseUrl + "/compress/"); + if (this.factory instanceof JdkClientHttpRequestFactory jdkClientHttpRequestFactory) { + jdkClientHttpRequestFactory.enableCompression(false); + } ClientHttpRequest request = this.factory.createRequest(uri, HttpMethod.POST); StreamUtils.copy("Payload to compress", StandardCharsets.UTF_8, request.getBody()); try (ClientHttpResponse response = request.execute()) { + assertThat(request.getHeaders().containsHeader("Accept-Encoding")).isFalse(); assertThat(response.getStatusCode()).as("Invalid response status").isEqualTo(HttpStatus.OK); - assertThat(response.getHeaders().containsHeader("Content-Encoding")).isFalse(); - assertThat(response.getBody()).as("Invalid request body").hasContent("Payload to compress"); + assertThat(response.getHeaders().containsHeader("Content-Encoding")).isTrue(); + assertThat(StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8)) + .as("Body should not be decompressed") + .doesNotContain("Payload to compress"); } }