Commit 5a0af271 by Ryan Baxter

Merge remote-tracking branch 'Upstream/master'

parents 50fac81a 18c4bc06
...@@ -1758,6 +1758,18 @@ If Spring AOP is enabled and `org.aspectj:aspectjweaver` is present on your runt ...@@ -1758,6 +1758,18 @@ If Spring AOP is enabled and `org.aspectj:aspectjweaver` is present on your runt
3. URI, sanitized for Atlas 3. URI, sanitized for Atlas
4. Client name 4. Client name
WARNING: Avoid using hardcoded url parameters within `RestTemplate`. When targeting dynamic endpoints use URL variables. This will avoid potential "GC Overhead Limit Reached" issues where `ServoMonitorCache` treats each url as a unique key.
[source,java,indent=0]
----
// recommended
String orderid = "1";
restTemplate.getForObject("http://testeurekabrixtonclient/orders/{orderid}", String.class, orderid)
// avoid
restTemplate.getForObject("http://testeurekabrixtonclient/orders/1", String.class)
----
[[netflix-metrics-spectator]] [[netflix-metrics-spectator]]
=== Metrics Collection: Spectator === Metrics Collection: Spectator
......
...@@ -52,11 +52,10 @@ public class RibbonLoadBalancerClient implements LoadBalancerClient { ...@@ -52,11 +52,10 @@ public class RibbonLoadBalancerClient implements LoadBalancerClient {
RibbonLoadBalancerContext context = this.clientFactory RibbonLoadBalancerContext context = this.clientFactory
.getLoadBalancerContext(serviceId); .getLoadBalancerContext(serviceId);
Server server = new Server(instance.getHost(), instance.getPort()); Server server = new Server(instance.getHost(), instance.getPort());
boolean secure = isSecure(server, serviceId); IClientConfig clientConfig = clientFactory.getClientConfig(serviceId);
URI uri = original; ServerIntrospector serverIntrospector = serverIntrospector(serviceId);
if (secure) { URI uri = RibbonUtils.updateToHttpsIfNeeded(original, clientConfig,
uri = UriComponentsBuilder.fromUri(uri).scheme("https").build().toUri(); serverIntrospector, server);
}
return context.reconstructURIWithServer(server, uri); return context.reconstructURIWithServer(server, uri);
} }
......
...@@ -22,16 +22,14 @@ import java.io.OutputStream; ...@@ -22,16 +22,14 @@ import java.io.OutputStream;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.Map.Entry;
import javax.servlet.ServletInputStream; import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestWrapper; import javax.servlet.ServletRequestWrapper;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpEntity;
...@@ -44,6 +42,7 @@ import org.springframework.util.Assert; ...@@ -44,6 +42,7 @@ import org.springframework.util.Assert;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartRequest; import org.springframework.web.multipart.MultipartRequest;
import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.DispatcherServlet;
...@@ -121,7 +120,7 @@ public class FormBodyWrapperFilter extends ZuulFilter { ...@@ -121,7 +120,7 @@ public class FormBodyWrapperFilter extends ZuulFilter {
.getField(this.requestField, request); .getField(this.requestField, request);
wrapper = new FormBodyRequestWrapper(wrapped); wrapper = new FormBodyRequestWrapper(wrapped);
ReflectionUtils.setField(this.requestField, request, wrapper); ReflectionUtils.setField(this.requestField, request, wrapper);
if(request instanceof ServletRequestWrapper) { if (request instanceof ServletRequestWrapper) {
ReflectionUtils.setField(this.servletRequestField, request, wrapper); ReflectionUtils.setField(this.servletRequestField, request, wrapper);
} }
} }
...@@ -233,7 +232,7 @@ public class FormBodyWrapperFilter extends ZuulFilter { ...@@ -233,7 +232,7 @@ public class FormBodyWrapperFilter extends ZuulFilter {
Set<String> result = new HashSet<>(); Set<String> result = new HashSet<>();
String query = this.request.getQueryString(); String query = this.request.getQueryString();
if (query != null) { if (query != null) {
for (String value : StringUtils.split(query, "&")) { for (String value : StringUtils.tokenizeToStringArray(query, "&")) {
if (value.contains("=")) { if (value.contains("=")) {
value = value.substring(0, value.indexOf("=")); value = value.substring(0, value.indexOf("="));
} }
......
...@@ -29,6 +29,7 @@ import org.mockito.MockitoAnnotations; ...@@ -29,6 +29,7 @@ import org.mockito.MockitoAnnotations;
import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerRequest; import org.springframework.cloud.client.loadbalancer.LoadBalancerRequest;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.RibbonServer; import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.RibbonServer;
import org.springframework.web.util.DefaultUriTemplateHandler;
import com.netflix.client.config.CommonClientConfigKey; import com.netflix.client.config.CommonClientConfigKey;
import com.netflix.client.config.IClientConfig; import com.netflix.client.config.IClientConfig;
...@@ -108,6 +109,31 @@ public class RibbonLoadBalancerClientTests { ...@@ -108,6 +109,31 @@ public class RibbonLoadBalancerClientTests {
} }
@Test @Test
public void testReconstructSecureUriWithSpecialCharsPath() {
testReconstructUriWithPath("https", "/foo=|");
}
@Test
public void testReconstructUnsecureUriWithSpecialCharsPath() {
testReconstructUriWithPath("http", "/foo=|");
}
private void testReconstructUriWithPath(String scheme, String path) {
RibbonServer server = getRibbonServer();
IClientConfig config = mock(IClientConfig.class);
when(config.get(CommonClientConfigKey.IsSecure)).thenReturn(true);
when(clientFactory.getClientConfig(server.getServiceId())).thenReturn(config);
RibbonLoadBalancerClient client = getRibbonLoadBalancerClient(server);
ServiceInstance serviceInstance = client.choose(server.getServiceId());
URI expanded = new DefaultUriTemplateHandler()
.expand(scheme + "://" + server.getServiceId() + path);
URI reconstructed = client.reconstructURI(serviceInstance, expanded);
assertEquals(expanded.getPath(), reconstructed.getPath());
}
@Test
@SneakyThrows @SneakyThrows
public void testReconstructUriWithSecureClientConfig() { public void testReconstructUriWithSecureClientConfig() {
RibbonServer server = getRibbonServer(); RibbonServer server = getRibbonServer();
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<archaius.version>0.7.4</archaius.version> <archaius.version>0.7.4</archaius.version>
<eureka.version>1.4.11</eureka.version> <eureka.version>1.4.11</eureka.version>
<feign.version>9.3.1</feign.version> <feign.version>9.3.1</feign.version>
<hystrix.version>1.5.5</hystrix.version> <hystrix.version>1.5.6</hystrix.version>
<ribbon.version>2.2.0</ribbon.version> <ribbon.version>2.2.0</ribbon.version>
<servo.version>0.10.1</servo.version> <servo.version>0.10.1</servo.version>
<zuul.version>1.2.2</zuul.version> <zuul.version>1.2.2</zuul.version>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment