Do not decompress HTTP responses when compression disabled

This commit refines changes made in gh-35225 so as to not decompress
HTTP responses if decompression support is not enabled.

Closes gh-35225
This commit is contained in:
Brian Clozel 2025-08-29 16:47:58 +02:00
parent 441b14b0c1
commit 9979de99fd
3 changed files with 17 additions and 14 deletions

View File

@ -112,7 +112,7 @@ class JdkClientHttpRequest extends AbstractStreamingClientHttpRequest {
TimeoutHandler timeoutHandler = null; TimeoutHandler timeoutHandler = null;
try { try {
HttpRequest request = buildRequest(headers, body); 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) { if (this.timeout != null) {
timeoutHandler = new TimeoutHandler(responseFuture, this.timeout); timeoutHandler = new TimeoutHandler(responseFuture, this.timeout);

View File

@ -116,29 +116,26 @@ public abstract class AbstractMockWebServerTests {
String encoding = request.getTarget().replace("/compress/",""); String encoding = request.getTarget().replace("/compress/","");
String requestBody = request.getBody().utf8(); String requestBody = request.getBody().utf8();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
if (encoding.equals("gzip")) { if(encoding.equals("deflate")) {
try(GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) {
gzipOutputStream.write(requestBody.getBytes());
gzipOutputStream.flush();
}
}
else if(encoding.equals("deflate")) {
try(DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(outputStream)) { try(DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(outputStream)) {
deflaterOutputStream.write(requestBody.getBytes()); deflaterOutputStream.write(requestBody.getBytes());
deflaterOutputStream.flush(); deflaterOutputStream.flush();
} }
} }
// compress anyway with gzip
else { else {
outputStream.write(requestBody.getBytes()); encoding = "gzip";
try(GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) {
gzipOutputStream.write(requestBody.getBytes());
gzipOutputStream.flush();
}
} }
Buffer buffer = new Buffer(); Buffer buffer = new Buffer();
buffer.write(outputStream.toByteArray()); buffer.write(outputStream.toByteArray());
MockResponse.Builder builder = new MockResponse.Builder() MockResponse.Builder builder = new MockResponse.Builder()
.body(buffer) .body(buffer)
.code(200); .code(200);
if (!encoding.isEmpty()) {
builder.setHeader(HttpHeaders.CONTENT_ENCODING, encoding); builder.setHeader(HttpHeaders.CONTENT_ENCODING, encoding);
}
return builder.build(); return builder.build();
} }
return new MockResponse.Builder().code(404).build(); return new MockResponse.Builder().code(404).build();

View File

@ -110,12 +110,18 @@ class JdkClientHttpRequestFactoryTests extends AbstractHttpRequestFactoryTests {
@Test @Test
void compressionDisabled() throws IOException { void compressionDisabled() throws IOException {
URI uri = URI.create(baseUrl + "/compress/"); URI uri = URI.create(baseUrl + "/compress/");
if (this.factory instanceof JdkClientHttpRequestFactory jdkClientHttpRequestFactory) {
jdkClientHttpRequestFactory.enableCompression(false);
}
ClientHttpRequest request = this.factory.createRequest(uri, HttpMethod.POST); ClientHttpRequest request = this.factory.createRequest(uri, HttpMethod.POST);
StreamUtils.copy("Payload to compress", StandardCharsets.UTF_8, request.getBody()); StreamUtils.copy("Payload to compress", StandardCharsets.UTF_8, request.getBody());
try (ClientHttpResponse response = request.execute()) { try (ClientHttpResponse response = request.execute()) {
assertThat(request.getHeaders().containsHeader("Accept-Encoding")).isFalse();
assertThat(response.getStatusCode()).as("Invalid response status").isEqualTo(HttpStatus.OK); assertThat(response.getStatusCode()).as("Invalid response status").isEqualTo(HttpStatus.OK);
assertThat(response.getHeaders().containsHeader("Content-Encoding")).isFalse(); assertThat(response.getHeaders().containsHeader("Content-Encoding")).isTrue();
assertThat(response.getBody()).as("Invalid request body").hasContent("Payload to compress"); assertThat(StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8))
.as("Body should not be decompressed")
.doesNotContain("Payload to compress");
} }
} }