From d57cea265eedf94451d6824c5e6cbaa89a8cf549 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 13 Aug 2018 14:26:24 -0400 Subject: [PATCH] Fix invalid URI error when Feign request URI does not end in /. See sc-netflix #3136 --- .../ribbon/LoadBalancerFeignClient.java | 8 +++++++- .../ribbon/FeignRibbonClientTests.java | 20 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) 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 ac18f7e1..4e210323 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 @@ -97,7 +97,13 @@ public class LoadBalancerFeignClient implements Client { } static URI cleanUrl(String originalUrl, String host) { - return URI.create(originalUrl.replaceFirst(host, "")); + String newUrl = originalUrl.replaceFirst(host, ""); + StringBuffer buffer = new StringBuffer(newUrl); + if((newUrl.startsWith("https://") && newUrl.length() == 8) || + (newUrl.startsWith("http://") && newUrl.length() == 7)) { + buffer.append("/"); + } + return URI.create(buffer.toString()); } private FeignLoadBalancer lbClient(String clientName) { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/FeignRibbonClientTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/FeignRibbonClientTests.java index ae82be9a..ab7fc108 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/FeignRibbonClientTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/ribbon/FeignRibbonClientTests.java @@ -37,7 +37,9 @@ import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.hamcrest.MockitoHamcrest.argThat; /** * @author Dave Syer @@ -87,14 +89,24 @@ public class FeignRibbonClientTests { when(stats.getSingleServerStat(any(Server.class))).thenReturn(mock(ServerStats.class)); } + @Test + public void remoteRequestIsSentAtRoot() throws Exception { + Request request = new RequestTemplate().method("GET").append("http://foo") + .request(); + this.client.execute(request, new Options()); + RequestMatcher matcher = new RequestMatcher("http://foo.com:8000/"); + verify(this.delegate).execute(argThat(matcher), + any(Options.class)); + } + @Test public void remoteRequestIsSent() throws Exception { Request request = new RequestTemplate().method("GET").append("http://foo/") .request(); this.client.execute(request, new Options()); RequestMatcher matcher = new RequestMatcher("http://foo.com:8000/"); - /*FIXME verify(this.delegate).execute(argThat(matcher), - any(Options.class));*/ + verify(this.delegate).execute(argThat(matcher), + any(Options.class)); } @Test @@ -103,8 +115,8 @@ public class FeignRibbonClientTests { .request(); this.client.execute(request, new Options()); RequestMatcher matcher = new RequestMatcher("https://foo.com:8000/"); - /*FIXME verify(this.delegate).execute(argThat(matcher), - any(Options.class));*/ + verify(this.delegate).execute(argThat(matcher), + any(Options.class)); } private final static class RequestMatcher extends CustomMatcher {