Skip to content

Commit b0a9252

Browse files
committed
avoid UndeclaredThrowableException when UNWRAP unwraps checked causes
1 parent dcd1dfb commit b0a9252

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ public Object invoke(Object[] argv) throws Throwable {
5656
retryer.continueOrPropagate(e);
5757
} catch (RetryableException th) {
5858
Throwable cause = th.getCause();
59-
if (methodHandlerConfiguration.getPropagationPolicy() == UNWRAP && cause != null) {
59+
if (methodHandlerConfiguration.getPropagationPolicy() == UNWRAP
60+
&& cause != null
61+
&& (cause instanceof RuntimeException || cause instanceof Error)) {
6062
throw cause;
6163
} else {
6264
throw th;

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import feign.querymap.FieldQueryMapEncoder;
5151
import java.io.IOException;
5252
import java.lang.reflect.Type;
53+
import java.net.ProtocolException;
5354
import java.net.URI;
5455
import java.time.Clock;
5556
import java.time.Instant;
@@ -708,6 +709,22 @@ void throwsRetryableExceptionIfNoUnderlyingCause() throws Exception {
708709
assertThat(exception.getMessage()).contains(message);
709710
}
710711

712+
@Test
713+
void doesNotUnwrapCheckedCauseWhenPropagationPolicyIsUnwrap() {
714+
TestInterface api =
715+
Feign.builder()
716+
.exceptionPropagationPolicy(UNWRAP)
717+
.retryer(new DefaultRetryer(1, 1, 1))
718+
.client(
719+
(_, _) -> {
720+
throw new ProtocolException("missing Location header for redirect");
721+
})
722+
.target(TestInterface.class, "http://localhost:" + server.getPort());
723+
724+
RetryableException exception = assertThrows(RetryableException.class, () -> api.post());
725+
assertThat(exception.getCause()).isInstanceOf(ProtocolException.class);
726+
}
727+
711728
@Test
712729
void whenReturnTypeIsResponseNoErrorHandling() {
713730
Map<String, Collection<String>> headers = new LinkedHashMap<>();

0 commit comments

Comments
 (0)