Skip to content

Commit 10cbe7e

Browse files
authored
Merge pull request spring-projects#160 from ryanjbaxter/error-handle-invalid-hostnames-159
Provide better error handling for invalid hostnames
2 parents e1460f9 + 538ede0 commit 10cbe7e

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerInterceptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.http.client.ClientHttpRequestExecution;
2424
import org.springframework.http.client.ClientHttpRequestInterceptor;
2525
import org.springframework.http.client.ClientHttpResponse;
26+
import org.springframework.util.Assert;
2627

2728
/**
2829
* @author Spencer Gibb
@@ -50,6 +51,7 @@ public ClientHttpResponse intercept(final HttpRequest request, final byte[] body
5051
final ClientHttpRequestExecution execution) throws IOException {
5152
final URI originalUri = request.getURI();
5253
String serviceName = originalUri.getHost();
54+
Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
5355
return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution));
5456
}
5557
}

spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.retry.RetryContext;
2929
import org.springframework.retry.policy.NeverRetryPolicy;
3030
import org.springframework.retry.support.RetryTemplate;
31+
import org.springframework.util.Assert;
3132

3233
/**
3334
* @author Ryan Baxter
@@ -66,6 +67,7 @@ public ClientHttpResponse intercept(final HttpRequest request, final byte[] body
6667
final ClientHttpRequestExecution execution) throws IOException {
6768
final URI originalUri = request.getURI();
6869
final String serviceName = originalUri.getHost();
70+
Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
6971
LoadBalancedRetryPolicy retryPolicy = lbRetryPolicyFactory.create(serviceName,
7072
loadBalancer);
7173
retryTemplate.setRetryPolicy(

spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptorTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.retry.policy.NeverRetryPolicy;
1717
import org.springframework.retry.support.RetryTemplate;
1818

19+
import static org.bouncycastle.crypto.tls.ConnectionEnd.client;
1920
import static org.hamcrest.MatcherAssert.assertThat;
2021
import static org.hamcrest.Matchers.is;
2122
import static org.mockito.Matchers.any;
@@ -72,6 +73,25 @@ public void interceptDisableRetry() throws Throwable {
7273
verify(lbRequestFactory).createRequest(request, body, execution);
7374
}
7475

76+
@Test(expected = IllegalStateException.class)
77+
public void interceptInvalidHost() throws Throwable {
78+
HttpRequest request = mock(HttpRequest.class);
79+
when(request.getURI()).thenReturn(new URI("http://foo_underscore"));
80+
ClientHttpResponse clientHttpResponse = new MockClientHttpResponse(new byte[]{}, HttpStatus.OK);
81+
LoadBalancedRetryPolicy policy = mock(LoadBalancedRetryPolicy.class);
82+
InterceptorRetryPolicy interceptorRetryPolicy = new InterceptorRetryPolicy(request, policy, client,"foo");
83+
LoadBalancedRetryPolicyFactory lbRetryPolicyFactory = mock(LoadBalancedRetryPolicyFactory.class);
84+
when(lbRetryPolicyFactory.create(eq("foo_underscore"), any(ServiceInstanceChooser.class))).thenReturn(policy);
85+
ServiceInstance serviceInstance = mock(ServiceInstance.class);
86+
when(client.choose(eq("foo_underscore"))).thenReturn(serviceInstance);
87+
when(client.execute(eq("foo_underscore"), eq(serviceInstance), any(LoadBalancerRequest.class))).thenReturn(clientHttpResponse);
88+
lbProperties.setEnabled(true);
89+
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, retryTemplate, lbProperties, lbRetryPolicyFactory);
90+
byte[] body = new byte[]{};
91+
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
92+
ClientHttpResponse rsp = interceptor.intercept(request, body, execution);
93+
}
94+
7595
@Test
7696
public void interceptNeverRetry() throws Throwable {
7797
HttpRequest request = mock(HttpRequest.class);

0 commit comments

Comments
 (0)