From b500a0585fa3fb5ad5bce1ea88b0cf9e1fbe11d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillaume=20Dufr=C3=AAne?= Date: Fri, 20 Oct 2023 11:22:47 +0200 Subject: [PATCH] Unzip/Deflate content on error status for Default Client (#2184) * Unzip/Deflate content on error status for Default Client * Fix assert message --------- Co-authored-by: Marvin Froeder --- core/src/main/java/feign/Client.java | 13 +++-- .../java/feign/client/AbstractClientTest.java | 53 +++++++++++++++++++ .../GoogleHttpClientTest.java | 10 ++++ .../java/feign/jaxrs2/JAXRSClientTest.java | 10 ++++ .../java/feign/okhttp/OkHttpClientTest.java | 10 ++++ 5 files changed, 89 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/feign/Client.java b/core/src/main/java/feign/Client.java index ee0f1303..c674c176 100644 --- a/core/src/main/java/feign/Client.java +++ b/core/src/main/java/feign/Client.java @@ -132,13 +132,12 @@ public interface Client { 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) diff --git a/core/src/test/java/feign/client/AbstractClientTest.java b/core/src/test/java/feign/client/AbstractClientTest.java index ff5bbff1..01e5c32a 100644 --- a/core/src/test/java/feign/client/AbstractClientTest.java +++ b/core/src/test/java/feign/client/AbstractClientTest.java @@ -17,6 +17,7 @@ import static feign.Util.UTF_8; 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; import feign.Feign.Builder; @@ -31,6 +32,7 @@ import feign.assertj.MockWebServerAssertions; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; @@ -410,6 +412,32 @@ public abstract class AbstractClientTest { .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 */ @@ -428,6 +456,31 @@ public abstract class AbstractClientTest { .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 */ diff --git a/googlehttpclient/src/test/java/feign/googlehttpclient/GoogleHttpClientTest.java b/googlehttpclient/src/test/java/feign/googlehttpclient/GoogleHttpClientTest.java index b1167498..a4ab7d41 100644 --- a/googlehttpclient/src/test/java/feign/googlehttpclient/GoogleHttpClientTest.java +++ b/googlehttpclient/src/test/java/feign/googlehttpclient/GoogleHttpClientTest.java @@ -54,11 +54,21 @@ public class GoogleHttpClientTest extends AbstractClientTest { 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); diff --git a/jaxrs2/src/test/java/feign/jaxrs2/JAXRSClientTest.java b/jaxrs2/src/test/java/feign/jaxrs2/JAXRSClientTest.java index 74a1d4f9..07d98398 100644 --- a/jaxrs2/src/test/java/feign/jaxrs2/JAXRSClientTest.java +++ b/jaxrs2/src/test/java/feign/jaxrs2/JAXRSClientTest.java @@ -152,11 +152,21 @@ public class JAXRSClientTest extends AbstractClientTest { 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); diff --git a/okhttp/src/test/java/feign/okhttp/OkHttpClientTest.java b/okhttp/src/test/java/feign/okhttp/OkHttpClientTest.java index 0e015afe..a00fec07 100644 --- a/okhttp/src/test/java/feign/okhttp/OkHttpClientTest.java +++ b/okhttp/src/test/java/feign/okhttp/OkHttpClientTest.java @@ -115,11 +115,21 @@ public class OkHttpClientTest extends AbstractClientTest { 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);