From 6b436c4133b2257596623c152d1ccb9b43008c14 Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Wed, 3 Mar 2021 11:20:48 +0100 Subject: [PATCH] Set followRedirects via properties. (#500) --- .../openfeign/FeignClientFactoryBean.java | 18 +- .../openfeign/FeignClientProperties.java | 19 +- .../openfeign/ribbon/FeignLoadBalancer.java | 58 +++--- .../ribbon/LoadBalancerFeignClient.java | 5 +- .../FeignClientOverrideDefaultsTests.java | 14 +- .../FeignClientUsingPropertiesTests.java | 17 +- .../ribbon/FeignLoadBalancerTests.java | 88 ++++----- .../RetryableFeignLoadBalancerTests.java | 171 +++++++++--------- .../resources/feign-properties.properties | 1 + 9 files changed, 216 insertions(+), 175 deletions(-) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java index 9ad6833b..8d61d127 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java @@ -97,6 +97,8 @@ public class FeignClientFactoryBean implements FactoryBean, Initializing private int connectTimeoutMillis = new Request.Options().connectTimeoutMillis(); + private boolean followRedirects = new Request.Options().isFollowRedirects(); + @Override public void afterPropertiesSet() { Assert.hasText(contextId, "Context id must be set"); @@ -193,6 +195,7 @@ public class FeignClientFactoryBean implements FactoryBean, Initializing builder.options(options); readTimeoutMillis = options.readTimeoutMillis(); connectTimeoutMillis = options.connectTimeoutMillis(); + followRedirects = options.isFollowRedirects(); } Map requestInterceptors = getInheritedAwareInstances( context, RequestInterceptor.class); @@ -232,9 +235,11 @@ public class FeignClientFactoryBean implements FactoryBean, Initializing ? config.getConnectTimeout() : connectTimeoutMillis; readTimeoutMillis = config.getReadTimeout() != null ? config.getReadTimeout() : readTimeoutMillis; + followRedirects = config.isFollowRedirects() != null ? config.isFollowRedirects() + : followRedirects; builder.options(new Request.Options(connectTimeoutMillis, TimeUnit.MILLISECONDS, - readTimeoutMillis, TimeUnit.MILLISECONDS, true)); + readTimeoutMillis, TimeUnit.MILLISECONDS, followRedirects)); if (config.getRetryer() != null) { Retryer retryer = getOrInstantiate(config.getRetryer()); @@ -520,13 +525,17 @@ public class FeignClientFactoryBean implements FactoryBean, Initializing && Objects.equals(fallback, that.fallback) && Objects.equals(fallbackFactory, that.fallbackFactory) && Objects.equals(name, that.name) && Objects.equals(path, that.path) - && Objects.equals(type, that.type) && Objects.equals(url, that.url); + && Objects.equals(type, that.type) && Objects.equals(url, that.url) + && Objects.equals(connectTimeoutMillis, that.connectTimeoutMillis) + && Objects.equals(readTimeoutMillis, that.readTimeoutMillis) + && Objects.equals(followRedirects, that.followRedirects); } @Override public int hashCode() { return Objects.hash(applicationContext, beanFactory, decode404, - inheritParentContext, fallback, fallbackFactory, name, path, type, url); + inheritParentContext, fallback, fallbackFactory, name, path, type, url, + readTimeoutMillis, connectTimeoutMillis, followRedirects); } @Override @@ -540,6 +549,9 @@ public class FeignClientFactoryBean implements FactoryBean, Initializing .append("beanFactory=").append(beanFactory).append(", ") .append("fallback=").append(fallback).append(", ") .append("fallbackFactory=").append(fallbackFactory).append("}") + .append("connectTimeoutMillis=").append(connectTimeoutMillis).append("}") + .append("readTimeoutMillis=").append(readTimeoutMillis).append("}") + .append("followRedirects=").append(followRedirects).append("}") .toString(); } diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java index 8b86e2f9..c0be28c0 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2020 the original author or authors. + * Copyright 2013-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * @author Eko Kurniawan Khannedy * @author Ilia Ilinykh * @author Ram Anaswara + * @author Olga Maciaszek-Sharma */ @ConfigurationProperties("feign.client") public class FeignClientProperties { @@ -136,6 +137,8 @@ public class FeignClientProperties { private ExceptionPropagationPolicy exceptionPropagationPolicy; + private Boolean followRedirects; + public Logger.Level getLoggerLevel() { return loggerLevel; } @@ -244,6 +247,14 @@ public class FeignClientProperties { this.exceptionPropagationPolicy = exceptionPropagationPolicy; } + public Boolean isFollowRedirects() { + return followRedirects; + } + + public void setFollowRedirects(Boolean followRedirects) { + this.followRedirects = followRedirects; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -266,8 +277,8 @@ public class FeignClientProperties { && Objects.equals(exceptionPropagationPolicy, that.exceptionPropagationPolicy) && Objects.equals(defaultRequestHeaders, that.defaultRequestHeaders) - && Objects.equals(defaultQueryParameters, - that.defaultQueryParameters); + && Objects.equals(defaultQueryParameters, that.defaultQueryParameters) + && Objects.equals(followRedirects, that.followRedirects); } @Override @@ -275,7 +286,7 @@ public class FeignClientProperties { return Objects.hash(loggerLevel, connectTimeout, readTimeout, retryer, errorDecoder, requestInterceptors, decode404, encoder, decoder, contract, exceptionPropagationPolicy, defaultQueryParameters, - defaultRequestHeaders); + defaultRequestHeaders, followRedirects); } } diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancer.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancer.java index 1f02d8f0..69ea180a 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancer.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancer.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2020 the original author or authors. + * Copyright 2013-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import com.netflix.client.AbstractLoadBalancerAwareClient; import com.netflix.client.ClientRequest; @@ -65,16 +66,19 @@ public class FeignLoadBalancer extends protected ServerIntrospector serverIntrospector; + protected boolean followRedirects; + public FeignLoadBalancer(ILoadBalancer lb, IClientConfig clientConfig, ServerIntrospector serverIntrospector) { super(lb, clientConfig); - this.setRetryHandler(RetryHandler.DEFAULT); + setRetryHandler(RetryHandler.DEFAULT); this.clientConfig = clientConfig; this.ribbon = RibbonProperties.from(clientConfig); RibbonProperties ribbon = this.ribbon; - this.connectTimeout = ribbon.getConnectTimeout(); - this.readTimeout = ribbon.getReadTimeout(); + connectTimeout = ribbon.getConnectTimeout(); + readTimeout = ribbon.getReadTimeout(); this.serverIntrospector = serverIntrospector; + followRedirects = ribbon.isFollowRedirects(); } @Override @@ -83,11 +87,13 @@ public class FeignLoadBalancer extends Request.Options options; if (configOverride != null) { RibbonProperties override = RibbonProperties.from(configOverride); - options = new Request.Options(override.connectTimeout(this.connectTimeout), - override.readTimeout(this.readTimeout)); + options = new Request.Options(override.connectTimeout(connectTimeout), + TimeUnit.MILLISECONDS, override.readTimeout(readTimeout), + TimeUnit.MILLISECONDS, override.isFollowRedirects(followRedirects)); } else { - options = new Request.Options(this.connectTimeout, this.readTimeout); + options = new Request.Options(connectTimeout, TimeUnit.MILLISECONDS, + readTimeout, TimeUnit.MILLISECONDS, followRedirects); } Response response = request.client().execute(request.toRequest(), options); return new RibbonResponse(request.getUri(), response); @@ -96,24 +102,24 @@ public class FeignLoadBalancer extends @Override public RequestSpecificRetryHandler getRequestSpecificRetryHandler( RibbonRequest request, IClientConfig requestConfig) { - if (this.ribbon.isOkToRetryOnAllOperations()) { - return new RequestSpecificRetryHandler(true, true, this.getRetryHandler(), + if (ribbon.isOkToRetryOnAllOperations()) { + return new RequestSpecificRetryHandler(true, true, getRetryHandler(), requestConfig); } if (!request.toRequest().httpMethod().name().equals("GET")) { - return new RequestSpecificRetryHandler(true, false, this.getRetryHandler(), + return new RequestSpecificRetryHandler(true, false, getRetryHandler(), requestConfig); } else { - return new RequestSpecificRetryHandler(true, true, this.getRetryHandler(), + return new RequestSpecificRetryHandler(true, true, getRetryHandler(), requestConfig); } } @Override public URI reconstructURIWithServer(Server server, URI original) { - URI uri = updateToSecureConnectionIfNeeded(original, this.clientConfig, - this.serverIntrospector, server); + URI uri = updateToSecureConnectionIfNeeded(original, clientConfig, + serverIntrospector, server); return super.reconstructURIWithServer(server, uri); } @@ -137,11 +143,11 @@ public class FeignLoadBalancer extends } Request toRequest() { - return toRequest(this.request); + return toRequest(request); } Client client() { - return this.client; + return client; } HttpRequest toHttpRequest() { @@ -179,16 +185,16 @@ public class FeignLoadBalancer extends } public Request getRequest() { - return this.request; + return request; } public Client getClient() { - return this.client; + return client; } @Override public Object clone() { - return new RibbonRequest(this.client, this.request, getUri()); + return new RibbonRequest(client, request, getUri()); } } @@ -206,37 +212,37 @@ public class FeignLoadBalancer extends @Override public Object getPayload() { - return this.response.body(); + return response.body(); } @Override public boolean hasPayload() { - return this.response.body() != null; + return response.body() != null; } @Override public boolean isSuccess() { - return this.response.status() == 200; + return response.status() == 200; } @Override public URI getRequestedURI() { - return this.uri; + return uri; } @Override public Map> getHeaders() { - return this.response.headers(); + return response.headers(); } Response toResponse() { - return this.response; + return response; } @Override public void close() throws IOException { - if (this.response != null && this.response.body() != null) { - this.response.body().close(); + if (response != null && response.body() != null) { + response.body().close(); } } diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/ribbon/LoadBalancerFeignClient.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/ribbon/LoadBalancerFeignClient.java index 3db242de..cae0e26a 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/ribbon/LoadBalancerFeignClient.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/ribbon/LoadBalancerFeignClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2020 the original author or authors. + * Copyright 2013-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ import org.springframework.cloud.netflix.ribbon.SpringClientFactory; /** * @author Dave Syer + * @author Olga Maciaszek-Sharma * */ public class LoadBalancerFeignClient implements Client { @@ -126,6 +127,8 @@ public class LoadBalancerFeignClient implements Client { setProperty(CommonClientConfigKey.ConnectTimeout, options.connectTimeoutMillis()); setProperty(CommonClientConfigKey.ReadTimeout, options.readTimeoutMillis()); + setProperty(CommonClientConfigKey.FollowRedirects, + options.isFollowRedirects()); } @Override diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientOverrideDefaultsTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientOverrideDefaultsTests.java index 98aedc86..d8ff92ac 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientOverrideDefaultsTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientOverrideDefaultsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2020 the original author or authors. + * Copyright 2013-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ package org.springframework.cloud.openfeign; +import java.util.concurrent.TimeUnit; + import feign.Contract; import feign.ExceptionPropagationPolicy; import feign.Feign; @@ -45,13 +47,13 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.GetMapping; import static org.assertj.core.api.Assertions.assertThat; /** * @author Spencer Gibb + * @author Olga Maciaszek-Sharma */ @SpringBootTest(classes = FeignClientOverrideDefaultsTests.TestConfiguration.class) @DirtiesContext @@ -128,6 +130,7 @@ class FeignClientOverrideDefaultsTests { Request.Options options = context.getInstance("bar", Request.Options.class); assertThat(options.connectTimeoutMillis()).isEqualTo(1); assertThat(options.readTimeoutMillis()).isEqualTo(1); + assertThat(options.isFollowRedirects()).isFalse(); } @Test @@ -166,7 +169,7 @@ class FeignClientOverrideDefaultsTests { configuration = BarConfiguration.class) interface BarClient { - @RequestMapping(value = "/", method = RequestMethod.GET) + @GetMapping("/") String get(); } @@ -238,7 +241,8 @@ class FeignClientOverrideDefaultsTests { @Bean Request.Options feignRequestOptions() { - return new Request.Options(1, 1); + return new Request.Options(1, TimeUnit.MILLISECONDS, 1, TimeUnit.MILLISECONDS, + false); } @Bean diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientUsingPropertiesTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientUsingPropertiesTests.java index 095c8726..300d54f1 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientUsingPropertiesTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientUsingPropertiesTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2020 the original author or authors. + * Copyright 2013-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -246,6 +246,21 @@ public class FeignClientUsingPropertiesTests { assertThat(options.readTimeoutMillis()).isEqualTo(5000); } + @Test + public void shouldSetFollowRedirects() { + FeignClientFactoryBean testFactoryBean = new FeignClientFactoryBean(); + testFactoryBean.setContextId("test"); + testFactoryBean.setType(FeignClientFactoryBean.class); + testFactoryBean.setApplicationContext(applicationContext); + + TimeoutClient client = testFactoryBean.feign(context).target(TimeoutClient.class, + "http://localhost:" + port); + + Request.Options options = getRequestOptions((Proxy) client); + + assertThat(options.isFollowRedirects()).isFalse(); + } + private Request.Options getRequestOptions(Proxy client) { Object invocationHandler = ReflectionTestUtils.getField(client, "h"); Map dispatch = (Map) ReflectionTestUtils diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancerTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancerTests.java index 34494b28..7b8304d4 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancerTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/FeignLoadBalancerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2020 the original author or authors. + * Copyright 2013-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,6 +44,7 @@ import org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer.RibbonReques import org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer.RibbonResponse; import static com.netflix.client.config.CommonClientConfigKey.ConnectTimeout; +import static com.netflix.client.config.CommonClientConfigKey.FollowRedirects; import static com.netflix.client.config.CommonClientConfigKey.IsSecure; import static com.netflix.client.config.CommonClientConfigKey.MaxAutoRetries; import static com.netflix.client.config.CommonClientConfigKey.MaxAutoRetriesNextServer; @@ -71,53 +72,47 @@ public class FeignLoadBalancerTests { private FeignLoadBalancer feignLoadBalancer; - private ServerIntrospector inspector = new DefaultServerIntrospector(); - - private Integer defaultConnectTimeout = 10000; - - private Integer defaultReadTimeout = 10000; + private final ServerIntrospector inspector = new DefaultServerIntrospector(); @Before public void setup() { MockitoAnnotations.initMocks(this); - when(this.config.get(MaxAutoRetries, DEFAULT_MAX_AUTO_RETRIES)).thenReturn(1); - when(this.config.get(MaxAutoRetriesNextServer, - DEFAULT_MAX_AUTO_RETRIES_NEXT_SERVER)).thenReturn(1); - when(this.config.get(OkToRetryOnAllOperations, eq(anyBoolean()))) - .thenReturn(true); - when(this.config.get(ConnectTimeout)).thenReturn(this.defaultConnectTimeout); - when(this.config.get(ReadTimeout)).thenReturn(this.defaultReadTimeout); - when(this.config.get(OkToRetryOnAllOperations, false)).thenReturn(true); + when(config.get(MaxAutoRetries, DEFAULT_MAX_AUTO_RETRIES)).thenReturn(1); + when(config.get(MaxAutoRetriesNextServer, DEFAULT_MAX_AUTO_RETRIES_NEXT_SERVER)) + .thenReturn(1); + when(config.get(OkToRetryOnAllOperations, eq(anyBoolean()))).thenReturn(true); + when(config.get(ConnectTimeout)).thenReturn(10000); + when(config.get(ReadTimeout)).thenReturn(10000); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); + when(config.get(OkToRetryOnAllOperations, false)).thenReturn(true); } @Test public void testUriInsecure() throws Exception { - when(this.config.get(IsSecure)).thenReturn(false); + when(config.get(IsSecure)).thenReturn(false); - this.feignLoadBalancer = new FeignLoadBalancer(this.lb, this.config, - this.inspector); + feignLoadBalancer = new FeignLoadBalancer(lb, config, inspector); Request request = new RequestTemplate().method(GET).target("https://foo/") .resolve(new HashMap<>()).request(); - RibbonRequest ribbonRequest = new RibbonRequest(this.delegate, request, + RibbonRequest ribbonRequest = new RibbonRequest(delegate, request, new URI(request.url())); Response response = Response.builder().request(request).status(200).reason("Test") .headers(Collections.emptyMap()).body(new byte[0]).build(); - when(this.delegate.execute(any(Request.class), any(Options.class))) + when(delegate.execute(any(Request.class), any(Options.class))) .thenReturn(response); - RibbonResponse resp = this.feignLoadBalancer.execute(ribbonRequest, null); + RibbonResponse resp = feignLoadBalancer.execute(ribbonRequest, null); assertThat(resp.getRequestedURI()).isEqualTo(new URI("https://foo")); } @Test public void testSecureUriFromClientConfig() throws Exception { - when(this.config.get(IsSecure)).thenReturn(true); - this.feignLoadBalancer = new FeignLoadBalancer(this.lb, this.config, - this.inspector); + when(config.get(IsSecure)).thenReturn(true); + feignLoadBalancer = new FeignLoadBalancer(lb, config, inspector); Server server = new Server("foo", 7777); - URI uri = this.feignLoadBalancer.reconstructURIWithServer(server, + URI uri = feignLoadBalancer.reconstructURIWithServer(server, new URI("https://foo/")); assertThat(uri).isEqualTo(new URI("https://foo:7777/")); } @@ -125,33 +120,31 @@ public class FeignLoadBalancerTests { @Test public void testInsecureUriFromInsecureClientConfigToSecureServerIntrospector() throws Exception { - when(this.config.get(IsSecure)).thenReturn(false); - this.feignLoadBalancer = new FeignLoadBalancer(this.lb, this.config, - new ServerIntrospector() { - @Override - public boolean isSecure(Server server) { - return true; - } + when(config.get(IsSecure)).thenReturn(false); + feignLoadBalancer = new FeignLoadBalancer(lb, config, new ServerIntrospector() { + @Override + public boolean isSecure(Server server) { + return true; + } - @Override - public Map getMetadata(Server server) { - return null; - } - }); + @Override + public Map getMetadata(Server server) { + return null; + } + }); Server server = new Server("foo", 7777); - URI uri = this.feignLoadBalancer.reconstructURIWithServer(server, + URI uri = feignLoadBalancer.reconstructURIWithServer(server, new URI("https://foo/")); assertThat(uri).isEqualTo(new URI("https://foo:7777/")); } @Test public void testSecureUriFromClientConfigOverride() throws Exception { - this.feignLoadBalancer = new FeignLoadBalancer(this.lb, this.config, - this.inspector); + feignLoadBalancer = new FeignLoadBalancer(lb, config, inspector); Server server = Mockito.mock(Server.class); when(server.getPort()).thenReturn(443); when(server.getHost()).thenReturn("foo"); - URI uri = this.feignLoadBalancer.reconstructURIWithServer(server, + URI uri = feignLoadBalancer.reconstructURIWithServer(server, new URI("https://bar/")); assertThat(uri).isEqualTo(new URI("https://foo:443/")); } @@ -163,7 +156,7 @@ public class FeignLoadBalancerTests { assertThat(request.url()).isEqualTo(url); - RibbonRequest ribbonRequest = new RibbonRequest(this.delegate, request, + RibbonRequest ribbonRequest = new RibbonRequest(delegate, request, new URI(request.url())); Request cloneRequest = ribbonRequest.toRequest(); @@ -174,7 +167,7 @@ public class FeignLoadBalancerTests { @Test public void testOverrideFeignLoadBalancer() throws Exception { - when(this.config.get(IsSecure)).thenReturn(false); + when(config.get(IsSecure)).thenReturn(false); Server server1 = new Server("foo", 6666); Server server2 = new Server("foo", 7777); BaseLoadBalancer baseLoadBalancer = new BaseLoadBalancer(); @@ -185,8 +178,7 @@ public class FeignLoadBalancerTests { } }); - this.feignLoadBalancer = new FeignLoadBalancer(baseLoadBalancer, this.config, - this.inspector) { + feignLoadBalancer = new FeignLoadBalancer(baseLoadBalancer, config, inspector) { protected void customizeLoadBalancerCommandBuilder( final FeignLoadBalancer.RibbonRequest request, final IClientConfig config, @@ -196,13 +188,13 @@ public class FeignLoadBalancerTests { }; Request request = new RequestTemplate().method(GET).resolve(new HashMap<>()) .request(); - RibbonResponse resp = this.feignLoadBalancer.executeWithLoadBalancer( - new RibbonRequest(this.delegate, request, new URI(request.url())), null); + RibbonResponse resp = feignLoadBalancer.executeWithLoadBalancer( + new RibbonRequest(delegate, request, new URI(request.url())), null); assertThat(resp.getRequestedURI().getPort()).isEqualTo(7777); request = new RequestTemplate().method(GET).header("c_ip", "666") .resolve(new HashMap<>()).request(); - resp = this.feignLoadBalancer.executeWithLoadBalancer( - new RibbonRequest(this.delegate, request, new URI(request.url())), null); + resp = feignLoadBalancer.executeWithLoadBalancer( + new RibbonRequest(delegate, request, new URI(request.url())), null); assertThat(resp.getRequestedURI().getPort()).isEqualTo(6666); } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/RetryableFeignLoadBalancerTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/RetryableFeignLoadBalancerTests.java index 4470310b..07c2b515 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/RetryableFeignLoadBalancerTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/RetryableFeignLoadBalancerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2020 the original author or authors. + * Copyright 2013-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,6 +59,7 @@ import org.springframework.retry.backoff.BackOffInterruptedException; import org.springframework.retry.backoff.BackOffPolicy; import static com.netflix.client.config.CommonClientConfigKey.ConnectTimeout; +import static com.netflix.client.config.CommonClientConfigKey.FollowRedirects; import static com.netflix.client.config.CommonClientConfigKey.MaxAutoRetries; import static com.netflix.client.config.CommonClientConfigKey.MaxAutoRetriesNextServer; import static com.netflix.client.config.CommonClientConfigKey.OkToRetryOnAllOperations; @@ -92,29 +93,28 @@ public class RetryableFeignLoadBalancerTests { @Mock private IClientConfig config; - private ServerIntrospector inspector = new DefaultServerIntrospector(); + private final ServerIntrospector inspector = new DefaultServerIntrospector(); - private Integer defaultConnectTimeout = 10000; + private final Integer defaultConnectTimeout = 10000; - private Integer defaultReadTimeout = 10000; + private final Integer defaultReadTimeout = 10000; @Before public void setup() { MockitoAnnotations.initMocks(this); - when(this.config.get(MaxAutoRetries, DEFAULT_MAX_AUTO_RETRIES)).thenReturn(1); - when(this.config.get(MaxAutoRetriesNextServer, - DEFAULT_MAX_AUTO_RETRIES_NEXT_SERVER)).thenReturn(1); - when(this.config.get(OkToRetryOnAllOperations, eq(anyBoolean()))) - .thenReturn(true); - when(this.config.get(ConnectTimeout)).thenReturn(this.defaultConnectTimeout); - when(this.config.get(ReadTimeout)).thenReturn(this.defaultReadTimeout); - when(this.config.get(OkToRetryOnAllOperations, false)).thenReturn(true); + when(config.get(MaxAutoRetries, DEFAULT_MAX_AUTO_RETRIES)).thenReturn(1); + when(config.get(MaxAutoRetriesNextServer, DEFAULT_MAX_AUTO_RETRIES_NEXT_SERVER)) + .thenReturn(1); + when(config.get(OkToRetryOnAllOperations, eq(anyBoolean()))).thenReturn(true); + when(config.get(ConnectTimeout)).thenReturn(defaultConnectTimeout); + when(config.get(ReadTimeout)).thenReturn(defaultReadTimeout); + when(config.get(OkToRetryOnAllOperations, false)).thenReturn(true); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); } @Test public void executeNoFailure() throws Exception { - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); SpringClientFactory clientFactory = mock(SpringClientFactory.class); doReturn(lbContext).when(clientFactory).getLoadBalancerContext(any(String.class)); IClientConfig config = mock(IClientConfig.class); @@ -123,9 +123,9 @@ public class RetryableFeignLoadBalancerTests { anyInt()); doReturn(true).when(config) .get(eq(CommonClientConfigKey.OkToRetryOnAllOperations), eq(false)); - doReturn(this.defaultConnectTimeout).when(config) + doReturn(defaultConnectTimeout).when(config) .get(eq(CommonClientConfigKey.ConnectTimeout)); - doReturn(this.defaultReadTimeout).when(config) + doReturn(defaultReadTimeout).when(config) .get(eq(CommonClientConfigKey.ReadTimeout)); doReturn("404,502,foo, ,").when(config).getPropertyAsString( eq(RibbonLoadBalancedRetryPolicy.RETRYABLE_STATUS_CODES), eq("")); @@ -141,8 +141,9 @@ public class RetryableFeignLoadBalancerTests { .headers(new HashMap<>()).build(); doReturn(response).when(client).execute(any(Request.class), any(Request.Options.class)); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - config, this.inspector, loadBalancedRetryFactory); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, loadBalancedRetryFactory); FeignLoadBalancer.RibbonResponse ribbonResponse = feignLb.execute(request, null); assertThat(ribbonResponse.toResponse().status()).isEqualTo(200); verify(client, times(1)).execute(any(Request.class), any(Request.Options.class)); @@ -157,8 +158,8 @@ public class RetryableFeignLoadBalancerTests { client, feignRequest, new URI("https://foo")); doThrow(new IOException("boom")).when(client).execute(any(Request.class), any(Request.Options.class)); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - this.config, this.inspector, new LoadBalancedRetryFactory() { + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, new LoadBalancedRetryFactory() { @Override public LoadBalancedRetryPolicy createRetryPolicy(String s, ServiceInstanceChooser serviceInstanceChooser) { @@ -189,8 +190,7 @@ public class RetryableFeignLoadBalancerTests { @Test public void executeRetry() throws Exception { - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); SpringClientFactory clientFactory = mock(SpringClientFactory.class); IClientConfig config = mock(IClientConfig.class); doReturn(1).when(config).get(eq(CommonClientConfigKey.MaxAutoRetries), anyInt()); @@ -198,14 +198,15 @@ public class RetryableFeignLoadBalancerTests { anyInt()); doReturn(true).when(config) .get(eq(CommonClientConfigKey.OkToRetryOnAllOperations), eq(false)); - doReturn(this.defaultConnectTimeout).when(config) + doReturn(defaultConnectTimeout).when(config) .get(eq(CommonClientConfigKey.ConnectTimeout)); - doReturn(this.defaultReadTimeout).when(config) + doReturn(defaultReadTimeout).when(config) .get(eq(CommonClientConfigKey.ReadTimeout)); doReturn("").when(config).getPropertyAsString( eq(RibbonLoadBalancedRetryPolicy.RETRYABLE_STATUS_CODES), eq("")); doReturn(config).when(clientFactory).getClientConfig(eq("default")); doReturn(lbContext).when(clientFactory).getLoadBalancerContext(any(String.class)); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); MyBackOffPolicy backOffPolicy = new MyBackOffPolicy(); RibbonLoadBalancedRetryFactory loadBalancedRetryFactory = new RibbonLoadBalancedRetryFactory( clientFactory) { @@ -224,8 +225,8 @@ public class RetryableFeignLoadBalancerTests { doThrow(new IOException("boom")).doReturn(response).when(client) .execute(any(Request.class), any(Request.Options.class)); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - config, this.inspector, loadBalancedRetryFactory); + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, loadBalancedRetryFactory); FeignLoadBalancer.RibbonResponse ribbonResponse = feignLb.execute(request, null); assertThat(ribbonResponse.toResponse().status()).isEqualTo(200); verify(client, times(2)).execute(any(Request.class), any(Request.Options.class)); @@ -234,8 +235,7 @@ public class RetryableFeignLoadBalancerTests { @Test public void executeRetryOnStatusCode() throws Exception { - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); SpringClientFactory clientFactory = mock(SpringClientFactory.class); IClientConfig config = mock(IClientConfig.class); doReturn(1).when(config).get(eq(CommonClientConfigKey.MaxAutoRetries), anyInt()); @@ -243,9 +243,9 @@ public class RetryableFeignLoadBalancerTests { anyInt()); doReturn(true).when(config) .get(eq(CommonClientConfigKey.OkToRetryOnAllOperations), eq(false)); - doReturn(this.defaultConnectTimeout).when(config) + doReturn(defaultConnectTimeout).when(config) .get(eq(CommonClientConfigKey.ConnectTimeout)); - doReturn(this.defaultReadTimeout).when(config) + doReturn(defaultReadTimeout).when(config) .get(eq(CommonClientConfigKey.ReadTimeout)); doReturn("404").when(config).getPropertyAsString( eq(RibbonLoadBalancedRetryPolicy.RETRYABLE_STATUS_CODES), eq("")); @@ -270,8 +270,9 @@ public class RetryableFeignLoadBalancerTests { .headers(new HashMap<>()).build(); doReturn(fourOFourResponse).doReturn(response).when(client) .execute(any(Request.class), any(Request.Options.class)); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - config, this.inspector, loadBalancedRetryFactory); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, loadBalancedRetryFactory); FeignLoadBalancer.RibbonResponse ribbonResponse = feignLb.execute(request, null); assertThat(ribbonResponse.toResponse().status()).isEqualTo(200); verify(client, times(2)).execute(any(Request.class), any(Request.Options.class)); @@ -281,11 +282,10 @@ public class RetryableFeignLoadBalancerTests { @Test public void executeRetryOnStatusCodeWithEmptyBody() throws Exception { int retriesNextServer = 0; - when(this.config.get(MaxAutoRetriesNextServer, - DEFAULT_MAX_AUTO_RETRIES_NEXT_SERVER)).thenReturn(retriesNextServer); - doReturn(new Server("foo", 80)).when(this.lb).chooseServer(any()); - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + when(config.get(MaxAutoRetriesNextServer, DEFAULT_MAX_AUTO_RETRIES_NEXT_SERVER)) + .thenReturn(retriesNextServer); + doReturn(new Server("foo", 80)).when(lb).chooseServer(any()); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); SpringClientFactory clientFactory = mock(SpringClientFactory.class); IClientConfig config = mock(IClientConfig.class); doReturn(1).when(config).get(eq(CommonClientConfigKey.MaxAutoRetries), anyInt()); @@ -293,9 +293,9 @@ public class RetryableFeignLoadBalancerTests { .get(eq(CommonClientConfigKey.MaxAutoRetriesNextServer), anyInt()); doReturn(true).when(config) .get(eq(CommonClientConfigKey.OkToRetryOnAllOperations), eq(false)); - doReturn(this.defaultConnectTimeout).when(config) + doReturn(defaultConnectTimeout).when(config) .get(eq(CommonClientConfigKey.ConnectTimeout)); - doReturn(this.defaultReadTimeout).when(config) + doReturn(defaultReadTimeout).when(config) .get(eq(CommonClientConfigKey.ReadTimeout)); doReturn("404").when(config).getPropertyAsString( eq(RibbonLoadBalancedRetryPolicy.RETRYABLE_STATUS_CODES), eq("")); @@ -320,8 +320,9 @@ public class RetryableFeignLoadBalancerTests { .headers(new HashMap<>()).build(); doReturn(fourOFourResponse).doReturn(response).when(client) .execute(any(Request.class), any(Request.Options.class)); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - config, this.inspector, loadBalancedRetryFactory); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, loadBalancedRetryFactory); FeignLoadBalancer.RibbonResponse ribbonResponse = feignLb.execute(request, null); assertThat(ribbonResponse.toResponse().status()).isEqualTo(404); assertThat(ribbonResponse.toResponse().body().length()) @@ -332,8 +333,7 @@ public class RetryableFeignLoadBalancerTests { @Test public void getRequestSpecificRetryHandler() throws Exception { - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); SpringClientFactory clientFactory = mock(SpringClientFactory.class); doReturn(lbContext).when(clientFactory).getLoadBalancerContext(any(String.class)); RibbonLoadBalancedRetryFactory loadBalancedRetryFactory = new RibbonLoadBalancedRetryFactory( @@ -347,10 +347,10 @@ public class RetryableFeignLoadBalancerTests { .headers(new HashMap<>()).build(); doReturn(response).when(client).execute(any(Request.class), any(Request.Options.class)); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - this.config, this.inspector, loadBalancedRetryFactory); + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, loadBalancedRetryFactory); RequestSpecificRetryHandler retryHandler = feignLb - .getRequestSpecificRetryHandler(request, this.config); + .getRequestSpecificRetryHandler(request, config); assertThat(retryHandler.getMaxRetriesOnNextServer()).isEqualTo(1); assertThat(retryHandler.getMaxRetriesOnSameServer()).isEqualTo(1); @@ -358,8 +358,7 @@ public class RetryableFeignLoadBalancerTests { @Test public void choose() throws Exception { - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); SpringClientFactory clientFactory = mock(SpringClientFactory.class); doReturn(lbContext).when(clientFactory).getLoadBalancerContext(any(String.class)); RibbonLoadBalancedRetryFactory loadBalancedRetryFactory = new RibbonLoadBalancedRetryFactory( @@ -367,8 +366,6 @@ public class RetryableFeignLoadBalancerTests { Request feignRequest = Request.create(GET, "https://foo", new HashMap<>(), new byte[] {}, UTF_8, null); Client client = mock(Client.class); - FeignLoadBalancer.RibbonRequest request = new FeignLoadBalancer.RibbonRequest( - client, feignRequest, new URI("https://foo")); Response response = Response.builder().request(feignRequest).status(200) .headers(new HashMap<>()).build(); doReturn(response).when(client).execute(any(Request.class), @@ -405,7 +402,7 @@ public class RetryableFeignLoadBalancerTests { public List getAllServers() { return null; } - }, this.config, this.inspector, loadBalancedRetryFactory); + }, config, inspector, loadBalancedRetryFactory); ServiceInstance serviceInstance = feignLb.choose("foo"); assertThat(serviceInstance.getHost()).isEqualTo("foo"); assertThat(serviceInstance.getPort()).isEqualTo(80); @@ -414,8 +411,7 @@ public class RetryableFeignLoadBalancerTests { @Test public void retryListenerTest() throws Exception { - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); SpringClientFactory clientFactory = mock(SpringClientFactory.class); IClientConfig config = mock(IClientConfig.class); doReturn(1).when(config).get(eq(CommonClientConfigKey.MaxAutoRetries), anyInt()); @@ -423,14 +419,15 @@ public class RetryableFeignLoadBalancerTests { anyInt()); doReturn(true).when(config) .get(eq(CommonClientConfigKey.OkToRetryOnAllOperations), eq(false)); - doReturn(this.defaultConnectTimeout).when(config) + doReturn(defaultConnectTimeout).when(config) .get(eq(CommonClientConfigKey.ConnectTimeout)); - doReturn(this.defaultReadTimeout).when(config) + doReturn(defaultReadTimeout).when(config) .get(eq(CommonClientConfigKey.ReadTimeout)); doReturn("").when(config).getPropertyAsString( eq(RibbonLoadBalancedRetryPolicy.RETRYABLE_STATUS_CODES), eq("")); doReturn(config).when(clientFactory).getClientConfig(eq("default")); doReturn(lbContext).when(clientFactory).getLoadBalancerContext(any(String.class)); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); MyBackOffPolicy backOffPolicy = new MyBackOffPolicy(); MyRetryListener myRetryListener = new MyRetryListener(); RibbonLoadBalancedRetryFactory loadBalancedRetryFactory = new RibbonLoadBalancedRetryFactory( @@ -455,8 +452,8 @@ public class RetryableFeignLoadBalancerTests { doThrow(new IOException("boom")).doReturn(response).when(client) .execute(any(Request.class), any(Request.Options.class)); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - config, this.inspector, loadBalancedRetryFactory); + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, loadBalancedRetryFactory); FeignLoadBalancer.RibbonResponse ribbonResponse = feignLb.execute(request, null); assertThat(ribbonResponse.toResponse().status()).isEqualTo(200); verify(client, times(2)).execute(any(Request.class), any(Request.Options.class)); @@ -466,8 +463,7 @@ public class RetryableFeignLoadBalancerTests { @Test(expected = TerminatedRetryException.class) public void retryListenerTestNoRetry() throws Exception { - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); SpringClientFactory clientFactory = mock(SpringClientFactory.class); IClientConfig config = mock(IClientConfig.class); doReturn(1).when(config).get(eq(CommonClientConfigKey.MaxAutoRetries), anyInt()); @@ -475,14 +471,15 @@ public class RetryableFeignLoadBalancerTests { anyInt()); doReturn(true).when(config) .get(eq(CommonClientConfigKey.OkToRetryOnAllOperations), eq(false)); - doReturn(this.defaultConnectTimeout).when(config) + doReturn(defaultConnectTimeout).when(config) .get(eq(CommonClientConfigKey.ConnectTimeout)); - doReturn(this.defaultReadTimeout).when(config) + doReturn(defaultReadTimeout).when(config) .get(eq(CommonClientConfigKey.ReadTimeout)); doReturn("").when(config).getPropertyAsString( eq(RibbonLoadBalancedRetryPolicy.RETRYABLE_STATUS_CODES), eq("")); doReturn(config).when(clientFactory).getClientConfig(eq("default")); doReturn(lbContext).when(clientFactory).getLoadBalancerContext(any(String.class)); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); MyBackOffPolicy backOffPolicy = new MyBackOffPolicy(); MyRetryListenerNotRetry myRetryListenerNotRetry = new MyRetryListenerNotRetry(); RibbonLoadBalancedRetryFactory loadBalancedRetryFactory = new RibbonLoadBalancedRetryFactory( @@ -502,15 +499,14 @@ public class RetryableFeignLoadBalancerTests { Client client = mock(Client.class); FeignLoadBalancer.RibbonRequest request = new FeignLoadBalancer.RibbonRequest( client, feignRequest, new URI("https://listener")); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - config, this.inspector, loadBalancedRetryFactory); - FeignLoadBalancer.RibbonResponse ribbonResponse = feignLb.execute(request, null); + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, loadBalancedRetryFactory); + feignLb.execute(request, null); } @Test public void retryWithDefaultConstructorTest() throws Exception { - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); SpringClientFactory clientFactory = mock(SpringClientFactory.class); IClientConfig config = mock(IClientConfig.class); doReturn(1).when(config).get(eq(CommonClientConfigKey.MaxAutoRetries), anyInt()); @@ -518,14 +514,15 @@ public class RetryableFeignLoadBalancerTests { anyInt()); doReturn(true).when(config) .get(eq(CommonClientConfigKey.OkToRetryOnAllOperations), eq(false)); - doReturn(this.defaultConnectTimeout).when(config) + doReturn(defaultConnectTimeout).when(config) .get(eq(CommonClientConfigKey.ConnectTimeout)); - doReturn(this.defaultReadTimeout).when(config) + doReturn(defaultReadTimeout).when(config) .get(eq(CommonClientConfigKey.ReadTimeout)); doReturn("").when(config).getPropertyAsString( eq(RibbonLoadBalancedRetryPolicy.RETRYABLE_STATUS_CODES), eq("")); doReturn(config).when(clientFactory).getClientConfig(eq("default")); doReturn(lbContext).when(clientFactory).getLoadBalancerContext(any(String.class)); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); MyBackOffPolicy backOffPolicy = new MyBackOffPolicy(); RibbonLoadBalancedRetryFactory loadBalancedRetryPolicyFactory = new RibbonLoadBalancedRetryFactory( clientFactory) { @@ -543,8 +540,8 @@ public class RetryableFeignLoadBalancerTests { .headers(new HashMap<>()).build(); doThrow(new IOException("boom")).doReturn(response).when(client) .execute(any(Request.class), any(Request.Options.class)); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - config, this.inspector, loadBalancedRetryPolicyFactory); + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, loadBalancedRetryPolicyFactory); FeignLoadBalancer.RibbonResponse ribbonResponse = feignLb.execute(request, null); assertThat(ribbonResponse.toResponse().status()).isEqualTo(200); verify(client, times(2)).execute(any(Request.class), any(Request.Options.class)); @@ -553,8 +550,7 @@ public class RetryableFeignLoadBalancerTests { @Test public void executeRetryFail() throws Exception { - RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(this.lb, - this.config); + RibbonLoadBalancerContext lbContext = new RibbonLoadBalancerContext(lb, config); lbContext.setRetryHandler(new DefaultLoadBalancerRetryHandler(1, 0, true)); SpringClientFactory clientFactory = mock(SpringClientFactory.class); IClientConfig config = mock(IClientConfig.class); @@ -563,14 +559,15 @@ public class RetryableFeignLoadBalancerTests { anyInt()); doReturn(true).when(config) .get(eq(CommonClientConfigKey.OkToRetryOnAllOperations), eq(false)); - doReturn(this.defaultConnectTimeout).when(config) + doReturn(defaultConnectTimeout).when(config) .get(eq(CommonClientConfigKey.ConnectTimeout)); - doReturn(this.defaultReadTimeout).when(config) + doReturn(defaultReadTimeout).when(config) .get(eq(CommonClientConfigKey.ReadTimeout)); doReturn("404").when(config).getPropertyAsString( eq(RibbonLoadBalancedRetryPolicy.RETRYABLE_STATUS_CODES), eq("")); doReturn(config).when(clientFactory).getClientConfig(eq("default")); doReturn(lbContext).when(clientFactory).getLoadBalancerContext(any(String.class)); + when(config.get(eq(FollowRedirects), any())).thenReturn(true); MyBackOffPolicy backOffPolicy = new MyBackOffPolicy(); RibbonLoadBalancedRetryFactory loadBalancedRetryFactory = new RibbonLoadBalancedRetryFactory( clientFactory) { @@ -598,28 +595,28 @@ public class RetryableFeignLoadBalancerTests { } @Override - public InputStream asInputStream() throws IOException { + public InputStream asInputStream() { return new ByteArrayInputStream("test".getBytes()); } @Override - public Reader asReader() throws IOException { + public Reader asReader() { return new InputStreamReader(asInputStream(), UTF_8); } @Override - public Reader asReader(Charset charset) throws IOException { + public Reader asReader(Charset charset) { return new InputStreamReader(asInputStream(), charset); } @Override - public void close() throws IOException { + public void close() { } }).build(); doReturn(fourOFourResponse).when(client).execute(any(Request.class), any(Request.Options.class)); - RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(this.lb, - config, this.inspector, loadBalancedRetryFactory); + RetryableFeignLoadBalancer feignLb = new RetryableFeignLoadBalancer(lb, config, + inspector, loadBalancedRetryFactory); FeignLoadBalancer.RibbonResponse ribbonResponse = feignLb.execute(request, null); verify(client, times(2)).execute(any(Request.class), any(Request.Options.class)); assertThat(backOffPolicy.getCount()).isEqualTo(1); @@ -629,7 +626,7 @@ public class RetryableFeignLoadBalancerTests { assertThat(new String(buf, 0, read)).isEqualTo("test"); } - class MyBackOffPolicy implements BackOffPolicy { + static class MyBackOffPolicy implements BackOffPolicy { private int count = 0; @@ -641,16 +638,16 @@ public class RetryableFeignLoadBalancerTests { @Override public void backOff(BackOffContext backOffContext) throws BackOffInterruptedException { - this.count++; + count++; } public int getCount() { - return this.count; + return count; } } - class MyRetryListener implements RetryListener { + static class MyRetryListener implements RetryListener { private int onError = 0; @@ -669,16 +666,16 @@ public class RetryableFeignLoadBalancerTests { @Override public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { - this.onError++; + onError++; } public int getOnError() { - return this.onError; + return onError; } } - class MyRetryListenerNotRetry implements RetryListener { + static class MyRetryListenerNotRetry implements RetryListener { @Override public boolean open(RetryContext context, diff --git a/spring-cloud-openfeign-core/src/test/resources/feign-properties.properties b/spring-cloud-openfeign-core/src/test/resources/feign-properties.properties index 02a49414..6b0ecfd6 100644 --- a/spring-cloud-openfeign-core/src/test/resources/feign-properties.properties +++ b/spring-cloud-openfeign-core/src/test/resources/feign-properties.properties @@ -22,3 +22,4 @@ feign.client.config.unwrap.readTimeout=1000 feign.client.config.unwrap.exceptionPropagationPolicy=unwrap feign.client.config.readTimeout.readTimeout=1000 feign.client.config.connectTimeout.connectTimeout=1000 +feign.client.config.default.followRedirects=false