2121import feign .codec .DecodeException ;
2222import feign .codec .Decoder ;
2323import feign .codec .ErrorDecoder ;
24+ import static feign .ExceptionPropagationPolicy .UNWRAP ;
2425import static feign .FeignException .errorExecuting ;
2526import static feign .FeignException .errorReading ;
2627import static feign .Util .checkNotNull ;
@@ -43,13 +44,14 @@ final class SynchronousMethodHandler implements MethodHandler {
4344 private final ErrorDecoder errorDecoder ;
4445 private final boolean decode404 ;
4546 private final boolean closeAfterDecode ;
47+ private final ExceptionPropagationPolicy propagationPolicy ;
4648
4749 private SynchronousMethodHandler (Target <?> target , Client client , Retryer retryer ,
4850 List <RequestInterceptor > requestInterceptors , Logger logger ,
4951 Logger .Level logLevel , MethodMetadata metadata ,
5052 RequestTemplate .Factory buildTemplateFromArgs , Options options ,
5153 Decoder decoder , ErrorDecoder errorDecoder , boolean decode404 ,
52- boolean closeAfterDecode ) {
54+ boolean closeAfterDecode , ExceptionPropagationPolicy propagationPolicy ) {
5355 this .target = checkNotNull (target , "target" );
5456 this .client = checkNotNull (client , "client for %s" , target );
5557 this .retryer = checkNotNull (retryer , "retryer for %s" , target );
@@ -64,6 +66,7 @@ private SynchronousMethodHandler(Target<?> target, Client client, Retryer retrye
6466 this .decoder = checkNotNull (decoder , "decoder for %s" , target );
6567 this .decode404 = decode404 ;
6668 this .closeAfterDecode = closeAfterDecode ;
69+ this .propagationPolicy = propagationPolicy ;
6770 }
6871
6972 @ Override
@@ -74,7 +77,16 @@ public Object invoke(Object[] argv) throws Throwable {
7477 try {
7578 return executeAndDecode (template );
7679 } catch (RetryableException e ) {
77- retryer .continueOrPropagate (e );
80+ try {
81+ retryer .continueOrPropagate (e );
82+ } catch (RetryableException th ) {
83+ Throwable cause = th .getCause ();
84+ if (propagationPolicy == UNWRAP && cause != null ) {
85+ throw cause ;
86+ } else {
87+ throw th ;
88+ }
89+ }
7890 if (logLevel != Logger .Level .NONE ) {
7991 logger .logRetry (metadata .configKey (), logLevel );
8092 }
@@ -178,16 +190,19 @@ static class Factory {
178190 private final Logger .Level logLevel ;
179191 private final boolean decode404 ;
180192 private final boolean closeAfterDecode ;
193+ private final ExceptionPropagationPolicy propagationPolicy ;
181194
182195 Factory (Client client , Retryer retryer , List <RequestInterceptor > requestInterceptors ,
183- Logger logger , Logger .Level logLevel , boolean decode404 , boolean closeAfterDecode ) {
196+ Logger logger , Logger .Level logLevel , boolean decode404 , boolean closeAfterDecode ,
197+ ExceptionPropagationPolicy propagationPolicy ) {
184198 this .client = checkNotNull (client , "client" );
185199 this .retryer = checkNotNull (retryer , "retryer" );
186200 this .requestInterceptors = checkNotNull (requestInterceptors , "requestInterceptors" );
187201 this .logger = checkNotNull (logger , "logger" );
188202 this .logLevel = checkNotNull (logLevel , "logLevel" );
189203 this .decode404 = decode404 ;
190204 this .closeAfterDecode = closeAfterDecode ;
205+ this .propagationPolicy = propagationPolicy ;
191206 }
192207
193208 public MethodHandler create (Target <?> target ,
@@ -198,7 +213,7 @@ public MethodHandler create(Target<?> target,
198213 ErrorDecoder errorDecoder ) {
199214 return new SynchronousMethodHandler (target , client , retryer , requestInterceptors , logger ,
200215 logLevel , md , buildTemplateFromArgs , options , decoder ,
201- errorDecoder , decode404 , closeAfterDecode );
216+ errorDecoder , decode404 , closeAfterDecode , propagationPolicy );
202217 }
203218 }
204219}
0 commit comments