Browse Source

Avoid `Decoder.decode` on 404 when void response type (#549)

* Avoid `Decoder.decode` on 404 when void response type

Avoid calling `decode` when receiving a 404 error and `decode404` is set and the response type is `void`.

* Update CHANGELOG
pull/556/head
Will May 8 years ago committed by Adrian Cole
parent
commit
57c609009c
  1. 3
      CHANGELOG.md
  2. 2
      core/src/main/java/feign/SynchronousMethodHandler.java
  3. 24
      core/src/test/java/feign/FeignTest.java

3
CHANGELOG.md

@ -1,3 +1,6 @@ @@ -1,3 +1,6 @@
### Version 9.4.1
* 404 responses are no longer swallowed for `void` return types.
### Version 9.4
* Adds Builder class to JAXBDecoder for disabling namespace-awareness (defaults to true).

2
core/src/main/java/feign/SynchronousMethodHandler.java

@ -132,7 +132,7 @@ final class SynchronousMethodHandler implements MethodHandler { @@ -132,7 +132,7 @@ final class SynchronousMethodHandler implements MethodHandler {
} else {
return decode(response);
}
} else if (decode404 && response.status() == 404) {
} else if (decode404 && response.status() == 404 && void.class != metadata.returnType()) {
return decode(response);
} else {
throw errorDecoder.decode(metadata.configKey(), response);

24
core/src/test/java/feign/FeignTest.java

@ -23,6 +23,7 @@ import okhttp3.mockwebserver.SocketPolicy; @@ -23,6 +23,7 @@ import okhttp3.mockwebserver.SocketPolicy;
import okhttp3.mockwebserver.MockWebServer;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import okio.Buffer;
import org.assertj.core.api.Fail;
@ -597,6 +598,18 @@ public class FeignTest { @@ -597,6 +598,18 @@ public class FeignTest {
api.post();
}
@Test
public void decodingDoesNotSwallow404ErrorsInDecode404Mode() throws Exception {
server.enqueue(new MockResponse().setResponseCode(404));
thrown.expect(IllegalArgumentException.class);
TestInterface api = new TestInterfaceBuilder()
.decode404()
.errorDecoder(new IllegalArgumentExceptionOn404())
.target("http://localhost:" + server.getPort());
api.queryMap(Collections.emptyMap());
}
@Test
public void okIfEncodeRootCauseHasNoMessage() throws Exception {
server.enqueue(new MockResponse().setBody("success!"));
@ -805,6 +818,17 @@ public class FeignTest { @@ -805,6 +818,17 @@ public class FeignTest {
}
}
static class IllegalArgumentExceptionOn404 extends ErrorDecoder.Default {
@Override
public Exception decode(String methodKey, Response response) {
if (response.status() == 404) {
return new IllegalArgumentException("bad zone name");
}
return super.decode(methodKey, response);
}
}
static final class TestInterfaceBuilder {
private final Feign.Builder delegate = new Feign.Builder()

Loading…
Cancel
Save