Skip to content

Commit 9979de9

Browse files
committed
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
1 parent 441b14b commit 9979de9

File tree

3 files changed

+17
-14
lines changed

3 files changed

+17
-14
lines changed

spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ protected ClientHttpResponse executeInternal(HttpHeaders headers, @Nullable Body
112112
TimeoutHandler timeoutHandler = null;
113113
try {
114114
HttpRequest request = buildRequest(headers, body);
115-
responseFuture = this.httpClient.sendAsync(request, new DecompressingBodyHandler());
115+
responseFuture = this.httpClient.sendAsync(request, this.compression ? new DecompressingBodyHandler() : HttpResponse.BodyHandlers.ofInputStream());
116116

117117
if (this.timeout != null) {
118118
timeoutHandler = new TimeoutHandler(responseFuture, this.timeout);

spring-web/src/test/java/org/springframework/http/client/AbstractMockWebServerTests.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,29 +116,26 @@ else if(request.getTarget().startsWith("/compress/") && request.getBody() != nul
116116
String encoding = request.getTarget().replace("/compress/","");
117117
String requestBody = request.getBody().utf8();
118118
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
119-
if (encoding.equals("gzip")) {
120-
try(GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) {
121-
gzipOutputStream.write(requestBody.getBytes());
122-
gzipOutputStream.flush();
123-
}
124-
}
125-
else if(encoding.equals("deflate")) {
119+
if(encoding.equals("deflate")) {
126120
try(DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(outputStream)) {
127121
deflaterOutputStream.write(requestBody.getBytes());
128122
deflaterOutputStream.flush();
129123
}
130124
}
125+
// compress anyway with gzip
131126
else {
132-
outputStream.write(requestBody.getBytes());
127+
encoding = "gzip";
128+
try(GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) {
129+
gzipOutputStream.write(requestBody.getBytes());
130+
gzipOutputStream.flush();
131+
}
133132
}
134133
Buffer buffer = new Buffer();
135134
buffer.write(outputStream.toByteArray());
136135
MockResponse.Builder builder = new MockResponse.Builder()
137136
.body(buffer)
138137
.code(200);
139-
if (!encoding.isEmpty()) {
140-
builder.setHeader(HttpHeaders.CONTENT_ENCODING, encoding);
141-
}
138+
builder.setHeader(HttpHeaders.CONTENT_ENCODING, encoding);
142139
return builder.build();
143140
}
144141
return new MockResponse.Builder().code(404).build();

spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,18 @@ void deleteRequestWithBody() throws Exception {
110110
@Test
111111
void compressionDisabled() throws IOException {
112112
URI uri = URI.create(baseUrl + "/compress/");
113+
if (this.factory instanceof JdkClientHttpRequestFactory jdkClientHttpRequestFactory) {
114+
jdkClientHttpRequestFactory.enableCompression(false);
115+
}
113116
ClientHttpRequest request = this.factory.createRequest(uri, HttpMethod.POST);
114117
StreamUtils.copy("Payload to compress", StandardCharsets.UTF_8, request.getBody());
115118
try (ClientHttpResponse response = request.execute()) {
119+
assertThat(request.getHeaders().containsHeader("Accept-Encoding")).isFalse();
116120
assertThat(response.getStatusCode()).as("Invalid response status").isEqualTo(HttpStatus.OK);
117-
assertThat(response.getHeaders().containsHeader("Content-Encoding")).isFalse();
118-
assertThat(response.getBody()).as("Invalid request body").hasContent("Payload to compress");
121+
assertThat(response.getHeaders().containsHeader("Content-Encoding")).isTrue();
122+
assertThat(StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8))
123+
.as("Body should not be decompressed")
124+
.doesNotContain("Payload to compress");
119125
}
120126
}
121127

0 commit comments

Comments
 (0)