diff --git a/core/src/main/java/feign/BaseBuilder.java b/core/src/main/java/feign/BaseBuilder.java index d279ed764..3c528bfb0 100644 --- a/core/src/main/java/feign/BaseBuilder.java +++ b/core/src/main/java/feign/BaseBuilder.java @@ -316,10 +316,21 @@ B enrich() { // enrich each response interceptor, then enrich the list as a whole ResponseInterceptor[] responseArray = clone.responseInterceptors.toArray(new ResponseInterceptor[0]); - for (int i = 0; i < responseArray.length; i++) { - responseArray[i] = + if (responseArray.length == 0) { + ResponseInterceptor defaultResponseInterceptor = (context, chain) -> chain.next(context); + ResponseInterceptor enrichedResponseInterceptor = (ResponseInterceptor) - Capability.enrich(responseArray[i], ResponseInterceptor.class, capabilities); + Capability.enrich( + defaultResponseInterceptor, ResponseInterceptor.class, capabilities); + if (enrichedResponseInterceptor != defaultResponseInterceptor) { + responseArray = new ResponseInterceptor[] {enrichedResponseInterceptor}; + } + } else { + for (int i = 0; i < responseArray.length; i++) { + responseArray[i] = + (ResponseInterceptor) + Capability.enrich(responseArray[i], ResponseInterceptor.class, capabilities); + } } ResponseInterceptors responseInterceptors = (ResponseInterceptors) diff --git a/core/src/test/java/feign/BaseBuilderTest.java b/core/src/test/java/feign/BaseBuilderTest.java index 30abf2d48..0d8776c32 100644 --- a/core/src/test/java/feign/BaseBuilderTest.java +++ b/core/src/test/java/feign/BaseBuilderTest.java @@ -21,6 +21,7 @@ import java.lang.reflect.Field; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -62,4 +63,25 @@ void checkEnrichTouchesAllBuilderFields() test( Feign.builder().requestInterceptor(_ -> {}).responseInterceptor((ic, c) -> c.next(ic)), 10); } + + @Test + void capabilityCanProvideResponseInterceptorWhenNoneConfigured() { + AtomicInteger enrichCalls = new AtomicInteger(); + ResponseInterceptor capabilityInterceptor = (context, chain) -> chain.next(context); + + Feign.Builder enrichedBuilder = + Feign.builder() + .addCapability( + new Capability() { + @Override + public ResponseInterceptor enrich(ResponseInterceptor responseInterceptor) { + enrichCalls.incrementAndGet(); + return capabilityInterceptor; + } + }) + .enrich(); + + assertThat(enrichCalls).hasValue(1); + assertThat(enrichedBuilder.responseInterceptors).containsExactly(capabilityInterceptor); + } }