From 9bd3a66b167f3bd6cb0b05ed91cc76d7a36d9b33 Mon Sep 17 00:00:00 2001 From: Andrei Sfat Date: Tue, 19 Apr 2016 22:56:58 +0300 Subject: [PATCH] #920 add slash when eureka.client.service-url.defaultZone does not contain one --- .../eureka/EurekaClientConfigBean.java | 17 ++++++- .../eureka/EurekaClientConfigBeanTests.java | 46 ++++++++++++++----- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java index b78866a4..0775a247 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java @@ -25,6 +25,7 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.core.env.PropertyResolver; +import org.springframework.util.StringUtils; import com.netflix.appinfo.EurekaAccept; import com.netflix.discovery.EurekaClientConfig; @@ -430,13 +431,25 @@ public class EurekaClientConfigBean implements EurekaClientConfig, EurekaConstan if (serviceUrls == null || serviceUrls.isEmpty()) { serviceUrls = this.serviceUrl.get(DEFAULT_ZONE); } - if (serviceUrls != null) { - return Arrays.asList(serviceUrls.split(",")); + if (!StringUtils.isEmpty(serviceUrls)) { + final String[] serviceUrlsSplit = serviceUrls.split(","); + List eurekaServiceUrls = new ArrayList<>(serviceUrlsSplit.length); + for (String eurekaServiceUrl : serviceUrlsSplit) { + if (!endsWithSlash(eurekaServiceUrl)) { + eurekaServiceUrl += "/"; + } + eurekaServiceUrls.add(eurekaServiceUrl); + } + return eurekaServiceUrls; } return new ArrayList<>(); } + private boolean endsWithSlash(String url) { + return url.endsWith("/"); + } + @Override public boolean shouldFilterOnlyUpInstances() { return this.filterOnlyUpInstances; diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBeanTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBeanTests.java index af33fe14..cc7f36c0 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBeanTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBeanTests.java @@ -65,9 +65,7 @@ public class EurekaClientConfigBeanTests { assertEquals("{defaultZone=http://example.com}", this.context.getBean(EurekaClientConfigBean.class).getServiceUrl() .toString()); - assertEquals("[http://example.com]", - this.context.getBean(EurekaClientConfigBean.class) - .getEurekaServerServiceUrls("defaultZone").toString()); + assertEquals("[http://example.com/]", getEurekaServiceUrlsForDefaultZone()); } @Test @@ -76,16 +74,15 @@ public class EurekaClientConfigBeanTests { this.context.getEnvironment().getPropertySources().addFirst(source); source.addPropertySource(new MapPropertySource("config", Collections . singletonMap("eureka.client.serviceUrl.defaultZone", - "http://example.com"))); + "http://example.com,http://example2.com"))); this.context.register(PropertyPlaceholderAutoConfiguration.class, TestConfiguration.class); this.context.refresh(); - assertEquals("{defaultZone=http://example.com}", + assertEquals("{defaultZone=http://example.com,http://example2.com}", this.context.getBean(EurekaClientConfigBean.class).getServiceUrl() .toString()); - assertEquals("[http://example.com]", - this.context.getBean(EurekaClientConfigBean.class) - .getEurekaServerServiceUrls("defaultZone").toString()); + assertEquals("[http://example.com/, http://example2.com/]", + getEurekaServiceUrlsForDefaultZone()); } @Test @@ -95,9 +92,36 @@ public class EurekaClientConfigBeanTests { this.context.register(PropertyPlaceholderAutoConfiguration.class, TestConfiguration.class); this.context.refresh(); - assertEquals("[http://example.com]", - this.context.getBean(EurekaClientConfigBean.class) - .getEurekaServerServiceUrls("defaultZone").toString()); + assertEquals("[http://example.com/]", getEurekaServiceUrlsForDefaultZone()); + } + + @Test + public void serviceUrlWithCustomZone() { + EnvironmentTestUtils.addEnvironment(this.context, + "eureka.client.serviceUrl.customZone:http://custom-example.com"); + this.context.register(PropertyPlaceholderAutoConfiguration.class, + TestConfiguration.class); + this.context.refresh(); + assertEquals("[http://custom-example.com/]", getEurekaServiceUrls("customZone")); + } + + @Test + public void serviceUrlWithEmptyServiceUrls() { + EnvironmentTestUtils.addEnvironment(this.context, + "eureka.client.serviceUrl.defaultZone:"); + this.context.register(PropertyPlaceholderAutoConfiguration.class, + TestConfiguration.class); + this.context.refresh(); + assertEquals("[]", getEurekaServiceUrlsForDefaultZone()); + } + + private String getEurekaServiceUrlsForDefaultZone() { + return getEurekaServiceUrls("defaultZone"); + } + + private String getEurekaServiceUrls(String myZone) { + return this.context.getBean(EurekaClientConfigBean.class) + .getEurekaServerServiceUrls(myZone).toString(); } @Configuration