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:
parent
441b14b0c1
commit
9979de99fd
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue