Skip to content

Commit 57c6090

Browse files
wjamadriancole
authored andcommitted
Avoid Decoder.decode on 404 when void response type (OpenFeign#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
1 parent 4aab37c commit 57c6090

3 files changed

Lines changed: 28 additions & 1 deletion

File tree

‎CHANGELOG.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
### Version 9.4.1
2+
* 404 responses are no longer swallowed for `void` return types.
3+
14
### Version 9.4
25
* Adds Builder class to JAXBDecoder for disabling namespace-awareness (defaults to true).
36

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ Object executeAndDecode(RequestTemplate template) throws Throwable {
132132
} else {
133133
return decode(response);
134134
}
135-
} else if (decode404 && response.status() == 404) {
135+
} else if (decode404 && response.status() == 404 && void.class != metadata.returnType()) {
136136
return decode(response);
137137
} else {
138138
throw errorDecoder.decode(metadata.configKey(), response);

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import okhttp3.mockwebserver.MockWebServer;
2424

2525
import java.util.Collection;
26+
import java.util.Collections;
2627
import java.util.LinkedHashMap;
2728
import okio.Buffer;
2829
import org.assertj.core.api.Fail;
@@ -597,6 +598,18 @@ public Object decode(Response response, Type type) throws IOException {
597598
api.post();
598599
}
599600

601+
@Test
602+
public void decodingDoesNotSwallow404ErrorsInDecode404Mode() throws Exception {
603+
server.enqueue(new MockResponse().setResponseCode(404));
604+
thrown.expect(IllegalArgumentException.class);
605+
606+
TestInterface api = new TestInterfaceBuilder()
607+
.decode404()
608+
.errorDecoder(new IllegalArgumentExceptionOn404())
609+
.target("http://localhost:" + server.getPort());
610+
api.queryMap(Collections.emptyMap());
611+
}
612+
600613
@Test
601614
public void okIfEncodeRootCauseHasNoMessage() throws Exception {
602615
server.enqueue(new MockResponse().setBody("success!"));
@@ -805,6 +818,17 @@ public Exception decode(String methodKey, Response response) {
805818
}
806819
}
807820

821+
static class IllegalArgumentExceptionOn404 extends ErrorDecoder.Default {
822+
823+
@Override
824+
public Exception decode(String methodKey, Response response) {
825+
if (response.status() == 404) {
826+
return new IllegalArgumentException("bad zone name");
827+
}
828+
return super.decode(methodKey, response);
829+
}
830+
}
831+
808832
static final class TestInterfaceBuilder {
809833

810834
private final Feign.Builder delegate = new Feign.Builder()

0 commit comments

Comments
 (0)