Skip to content

Commit

Permalink
Unzip/Deflate content on error status for Default Client (#2184)
Browse files Browse the repository at this point in the history
* Unzip/Deflate content on error status for Default Client

* Fix assert message

---------

Co-authored-by: Marvin Froeder <[email protected]>
  • Loading branch information
gdufrene and velo authored Oct 20, 2023
1 parent d22a1f3 commit ccfee12
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 7 deletions.
13 changes: 6 additions & 7 deletions core/src/main/java/feign/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,12 @@ Response convertResponse(HttpURLConnection connection, Request request) throws I
if (status >= 400) {
stream = connection.getErrorStream();
} else {
if (this.isGzip(headers.get(CONTENT_ENCODING))) {
stream = new GZIPInputStream(connection.getInputStream());
} else if (this.isDeflate(headers.get(CONTENT_ENCODING))) {
stream = new InflaterInputStream(connection.getInputStream());
} else {
stream = connection.getInputStream();
}
stream = connection.getInputStream();
}
if (this.isGzip(headers.get(CONTENT_ENCODING))) {
stream = new GZIPInputStream(stream);
} else if (this.isDeflate(headers.get(CONTENT_ENCODING))) {
stream = new InflaterInputStream(stream);
}
return Response.builder()
.status(status)
Expand Down
53 changes: 53 additions & 0 deletions core/src/test/java/feign/client/AbstractClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import feign.Client;
import feign.CollectionFormat;
Expand Down Expand Up @@ -420,6 +421,32 @@ public void canSupportGzip() throws Exception {
assertThat(result).isNotNull().isEqualToIgnoringCase(responseData);
}

@Test
public void canSupportGzipOnError() throws Exception {
/* enqueue a zipped response */
final String responseData = "Compressed Data";
server.enqueue(
new MockResponse()
.setResponseCode(400)
.addHeader("Content-Encoding", "gzip")
.setBody(new Buffer().write(compress(responseData))));

TestInterface api =
newBuilder().target(TestInterface.class, "http://localhost:" + server.getPort());

try {
api.get();
fail("Expect FeignException");
} catch (FeignException e) {
/* verify that the response is unzipped */
assertThat(e.responseBody())
.isNotEmpty()
.map(body -> new String(body.array(), StandardCharsets.UTF_8))
.get()
.isEqualTo(responseData);
}
}

@Test
public void canSupportDeflate() throws Exception {
/* enqueue a zipped response */
Expand All @@ -438,6 +465,32 @@ public void canSupportDeflate() throws Exception {
assertThat(result).isNotNull().isEqualToIgnoringCase(responseData);
}

@Test
public void canSupportDeflateOnError() throws Exception {
/* enqueue a zipped response */
final String responseData = "Compressed Data";
server.enqueue(
new MockResponse()
.setResponseCode(400)
.addHeader("Content-Encoding", "deflate")
.setBody(new Buffer().write(deflate(responseData))));

TestInterface api =
newBuilder().target(TestInterface.class, "http://localhost:" + server.getPort());

try {
api.get();
fail("Expect FeignException");
} catch (FeignException e) {
/* verify that the response is unzipped */
assertThat(e.responseBody())
.isNotEmpty()
.map(body -> new String(body.array(), StandardCharsets.UTF_8))
.get()
.isEqualTo(responseData);
}
}

@Test
public void canExceptCaseInsensitiveHeader() throws Exception {
/* enqueue a zipped response */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,21 @@ public void canSupportGzip() throws Exception {
assumeFalse("Google HTTP client client do not support gzip compression", false);
}

@Override
public void canSupportGzipOnError() throws Exception {
assumeFalse("Google HTTP client client do not support gzip compression", false);
}

@Override
public void canSupportDeflate() throws Exception {
assumeFalse("Google HTTP client client do not support deflate compression", false);
}

@Override
public void canSupportDeflateOnError() throws Exception {
assumeFalse("Google HTTP client client do not support deflate compression", false);
}

@Override
public void canExceptCaseInsensitiveHeader() throws Exception {
assumeFalse("Google HTTP client client do not support gzip compression", false);
Expand Down
10 changes: 10 additions & 0 deletions jaxrs2/src/test/java/feign/jaxrs2/JAXRSClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -159,11 +159,21 @@ public void canSupportGzip() throws Exception {
assumeFalse("JaxRS client do not support gzip compression", false);
}

@Override
public void canSupportGzipOnError() throws Exception {
assumeFalse("JaxRS client do not support gzip compression", false);
}

@Override
public void canSupportDeflate() throws Exception {
assumeFalse("JaxRS client do not support deflate compression", false);
}

@Override
public void canSupportDeflateOnError() throws Exception {
assumeFalse("JaxRS client do not support deflate compression", false);
}

@Override
public void canExceptCaseInsensitiveHeader() throws Exception {
assumeFalse("JaxRS client do not support gzip compression", false);
Expand Down
10 changes: 10 additions & 0 deletions okhttp/src/test/java/feign/okhttp/OkHttpClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,21 @@ public void canSupportGzip() throws Exception {
assumeFalse("OkHTTP client do not support gzip compression", false);
}

@Override
public void canSupportGzipOnError() throws Exception {
assumeFalse("OkHTTP client do not support gzip compression", false);
}

@Override
public void canSupportDeflate() throws Exception {
assumeFalse("OkHTTP client do not support deflate compression", false);
}

@Override
public void canSupportDeflateOnError() throws Exception {
assumeFalse("OkHTTP client do not support deflate compression", false);
}

@Override
public void canExceptCaseInsensitiveHeader() throws Exception {
assumeFalse("OkHTTP client do not support gzip compression", false);
Expand Down

0 comments on commit ccfee12

Please sign in to comment.