Skip to content

Commit 93e912c

Browse files
JonathanORyan Baxter
authored and
Ryan Baxter
committed
Fix connection leak when a status is retryable (spring-projects#253)
1 parent dd16ce0 commit 93e912c

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,10 @@ public ClientHttpResponse doWithRetry(RetryContext context)
8383
ClientHttpResponse response = RetryLoadBalancerInterceptor.this.loadBalancer.execute(
8484
serviceName, serviceInstance,
8585
requestFactory.createRequest(request, body, execution));
86-
if(retryPolicy != null && retryPolicy.retryableStatusCode(response.getRawStatusCode())) {
87-
throw new RetryableStatusCodeException(serviceName, response.getRawStatusCode());
86+
int statusCode = response.getRawStatusCode();
87+
if(retryPolicy != null && retryPolicy.retryableStatusCode(statusCode)) {
88+
response.close();
89+
throw new RetryableStatusCodeException(serviceName, statusCode);
8890
}
8991
return response;
9092
}

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.springframework.cloud.client.loadbalancer;
22

33
import java.io.IOException;
4+
import java.io.InputStream;
45
import java.net.URI;
56
import org.junit.After;
67
import org.junit.Before;
@@ -130,7 +131,8 @@ public void interceptSuccess() throws Throwable {
130131
public void interceptRetryOnStatusCode() throws Throwable {
131132
HttpRequest request = mock(HttpRequest.class);
132133
when(request.getURI()).thenReturn(new URI("http://foo"));
133-
ClientHttpResponse clientHttpResponseNotFound = new MockClientHttpResponse(new byte[]{}, HttpStatus.NOT_FOUND);
134+
InputStream notFoundStream = mock(InputStream.class);
135+
ClientHttpResponse clientHttpResponseNotFound = new MockClientHttpResponse(notFoundStream, HttpStatus.NOT_FOUND);
134136
ClientHttpResponse clientHttpResponseOk = new MockClientHttpResponse(new byte[]{}, HttpStatus.OK);
135137
LoadBalancedRetryPolicy policy = mock(LoadBalancedRetryPolicy.class);
136138
when(policy.retryableStatusCode(eq(HttpStatus.NOT_FOUND.value()))).thenReturn(true);
@@ -148,6 +150,7 @@ public void interceptRetryOnStatusCode() throws Throwable {
148150
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
149151
ClientHttpResponse rsp = interceptor.intercept(request, body, execution);
150152
verify(client, times(2)).execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class));
153+
verify(notFoundStream, times(1)).close();
151154
assertThat(rsp, is(clientHttpResponseOk));
152155
verify(lbRequestFactory, times(2)).createRequest(request, body, execution);
153156
}

0 commit comments

Comments
 (0)