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;
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);

View File

@ -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);
}
return builder.build();
}
return new MockResponse.Builder().code(404).build();

View File

@ -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");
}
}