Fix connection leak when a status is retryable (#253)

This commit is contained in:
Jonathan Oddy
2017-10-02 15:57:03 +01:00
committed by Ryan Baxter
parent 8c42673d30
commit f207bcad28
2 changed files with 8 additions and 3 deletions

View File

@@ -103,8 +103,10 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto
ClientHttpResponse response = RetryLoadBalancerInterceptor.this.loadBalancer.execute(
serviceName, serviceInstance,
requestFactory.createRequest(request, body, execution));
if(retryPolicy != null && retryPolicy.retryableStatusCode(response.getRawStatusCode())) {
throw new RetryableStatusCodeException(serviceName, response.getRawStatusCode());
int statusCode = response.getRawStatusCode();
if(retryPolicy != null && retryPolicy.retryableStatusCode(statusCode)) {
response.close();
throw new RetryableStatusCodeException(serviceName, statusCode);
}
return response;
}

View File

@@ -1,6 +1,7 @@
package org.springframework.cloud.client.loadbalancer;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import org.junit.After;
import org.junit.Before;
@@ -130,7 +131,8 @@ public class RetryLoadBalancerInterceptorTest {
public void interceptRetryOnStatusCode() throws Throwable {
HttpRequest request = mock(HttpRequest.class);
when(request.getURI()).thenReturn(new URI("http://foo"));
ClientHttpResponse clientHttpResponseNotFound = new MockClientHttpResponse(new byte[]{}, HttpStatus.NOT_FOUND);
InputStream notFoundStream = mock(InputStream.class);
ClientHttpResponse clientHttpResponseNotFound = new MockClientHttpResponse(notFoundStream, HttpStatus.NOT_FOUND);
ClientHttpResponse clientHttpResponseOk = new MockClientHttpResponse(new byte[]{}, HttpStatus.OK);
LoadBalancedRetryPolicy policy = mock(LoadBalancedRetryPolicy.class);
when(policy.retryableStatusCode(eq(HttpStatus.NOT_FOUND.value()))).thenReturn(true);
@@ -148,6 +150,7 @@ public class RetryLoadBalancerInterceptorTest {
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
ClientHttpResponse rsp = interceptor.intercept(request, body, execution);
verify(client, times(2)).execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class));
verify(notFoundStream, times(1)).close();
assertThat(rsp, is(clientHttpResponseOk));
verify(lbRequestFactory, times(2)).createRequest(request, body, execution);
}