From d51112e6afdf270a35201aef39a9d9b1b26c592e Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Fri, 19 Jan 2018 15:27:15 -0500 Subject: [PATCH] Pass the right request to getSecureRequest. Fixes #2667. (#2669) --- .../RetryableRibbonLoadBalancingHttpClient.java | 12 +++++++----- .../apache/RibbonLoadBalancingHttpClientTests.java | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java index 5ff08a21..2b36e32a 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java @@ -42,6 +42,7 @@ import org.springframework.retry.backoff.BackOffPolicy; import org.springframework.retry.backoff.NoBackOffPolicy; import org.springframework.retry.policy.NeverRetryPolicy; import org.springframework.retry.support.RetryTemplate; +import org.springframework.web.util.UriComponentsBuilder; import com.netflix.client.RequestSpecificRetryHandler; import com.netflix.client.RetryHandler; import com.netflix.client.config.CommonClientConfigKey; @@ -124,13 +125,14 @@ public class RetryableRibbonLoadBalancingHttpClient extends RibbonLoadBalancingH ServiceInstance service = ((LoadBalancedRetryContext)context).getServiceInstance(); if(service != null) { //Reconstruct the request URI using the host and port set in the retry context - newRequest = newRequest.withNewUri(new URI(service.getUri().getScheme(), - newRequest.getURI().getUserInfo(), service.getHost(), service.getPort(), - newRequest.getURI().getPath(), newRequest.getURI().getQuery(), - newRequest.getURI().getFragment())); + newRequest = newRequest.withNewUri(UriComponentsBuilder.newInstance().host(service.getHost()) + .scheme(service.getUri().getScheme()).userInfo(newRequest.getURI().getUserInfo()) + .port(service.getPort()).path(newRequest.getURI().getPath()) + .query(newRequest.getURI().getQuery()).fragment(newRequest.getURI().getFragment()) + .build().encode().toUri()); } } - newRequest = getSecureRequest(request, configOverride); + newRequest = getSecureRequest(newRequest, configOverride); HttpUriRequest httpUriRequest = newRequest.toRequest(requestConfig); final HttpResponse httpResponse = RetryableRibbonLoadBalancingHttpClient.this.delegate.execute(httpUriRequest); if(retryPolicy.retryableStatusCode(httpResponse.getStatusLine().getStatusCode())) { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java index 40b793b1..571449b0 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java @@ -428,7 +428,7 @@ public class RibbonLoadBalancingHttpClientTests { String host = serviceName; int port = 80; HttpMethod method = HttpMethod.GET; - final URI uri = new URI("https://" + host + ":" + port + "/a%2Bb"); + final URI uri = new URI("https://" + host + ":" + port + "/a%20b"); RibbonCommandContext context = new RibbonCommandContext(serviceName, method.toString(), uri.toString(), true, new LinkedMultiValueMap(), new LinkedMultiValueMap(), new ByteArrayInputStream(new String("bar").getBytes()),