Skip to content

Commit aafdcec

Browse files
committed
Customize connection request timeout
Prior to this commit it was not possible to easily customize the connection request timeout used by the HttpClient. Both `HttpComponentsClientHttpRequestFactory` and `HttpComponentsClientHttpRequestFactoryTests` have been updated to support a `connectionRequestTimeout` property. Issue: SPR-12166
1 parent 24b8274 commit aafdcec

File tree

4 files changed

+39
-2
lines changed

4 files changed

+39
-2
lines changed

spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest
6161

6262
private int connectTimeout;
6363

64+
private int connectionRequestTimeout;
65+
6466
private int socketTimeout;
6567

6668
private boolean bufferRequestBody = true;
@@ -139,6 +141,16 @@ private void setLegacyConnectionTimeout(HttpClient client, int timeout) {
139141
}
140142
}
141143

144+
/**
145+
* Set the timeout in milliseconds used when requesting a connection from the connection
146+
* manager using the underlying HttpClient.
147+
* A timeout value of 0 specifies an infinite timeout.
148+
* @param connectionRequestTimeout the timeout value to request a connection in milliseconds
149+
*/
150+
public void setConnectionRequestTimeout(int connectionRequestTimeout) {
151+
this.connectionRequestTimeout = connectionRequestTimeout;
152+
}
153+
142154
/**
143155
* Set the socket read timeout for the underlying HttpClient.
144156
* A timeout value of 0 specifies an infinite timeout.
@@ -193,9 +205,10 @@ public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IO
193205
config = ((Configurable) httpRequest).getConfig();
194206
}
195207
if (config == null) {
196-
if (this.socketTimeout > 0 || this.connectTimeout > 0) {
208+
if (this.connectTimeout > 0 || this.connectionRequestTimeout > 0 || this.socketTimeout > 0) {
197209
config = RequestConfig.custom()
198210
.setConnectTimeout(this.connectTimeout)
211+
.setConnectionRequestTimeout(this.connectionRequestTimeout)
199212
.setSocketTimeout(this.socketTimeout)
200213
.build();
201214
}

spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public class HttpComponentsHttpInvokerRequestExecutor extends AbstractHttpInvoke
7070

7171
private HttpClient httpClient;
7272
private int connectionTimeout = 0;
73+
private int connectionRequestTimeout = 0;
7374
private int readTimeout = DEFAULT_READ_TIMEOUT_MILLISECONDS;
7475

7576

@@ -148,6 +149,16 @@ private void setLegacyConnectionTimeout(HttpClient client, int timeout) {
148149
}
149150
}
150151

152+
/**
153+
* Set the timeout in milliseconds used when requesting a connection from the connection
154+
* manager using the underlying HttpClient.
155+
* A timeout value of 0 specifies an infinite timeout.
156+
* @param connectionRequestTimeout the timeout value to request a connection in milliseconds
157+
*/
158+
public void setConnectionRequestTimeout(int connectionRequestTimeout) {
159+
this.connectionRequestTimeout = connectionRequestTimeout;
160+
}
161+
151162
/**
152163
* Set the socket read timeout for the underlying HttpClient.
153164
* A timeout value of 0 specifies an infinite timeout.
@@ -240,9 +251,10 @@ protected HttpPost createHttpPost(HttpInvokerClientConfiguration config) throws
240251
* @return the RequestConfig to use
241252
*/
242253
protected RequestConfig createRequestConfig(HttpInvokerClientConfiguration config) {
243-
if (this.connectionTimeout > 0 || this.readTimeout > 0) {
254+
if (this.connectionTimeout > 0 || this.connectionRequestTimeout > 0 || this.readTimeout > 0) {
244255
return RequestConfig.custom()
245256
.setConnectTimeout(this.connectionTimeout)
257+
.setConnectionRequestTimeout(this.connectionRequestTimeout)
246258
.setSocketTimeout(this.readTimeout)
247259
.build();
248260
}

spring-web/src/test/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactoryTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public void assertCustomConfig() throws Exception {
6363
HttpClient httpClient = HttpClientBuilder.create().build();
6464
HttpComponentsClientHttpRequestFactory hrf = new HttpComponentsClientHttpRequestFactory(httpClient);
6565
hrf.setConnectTimeout(1234);
66+
hrf.setConnectionRequestTimeout(4321);
6667
hrf.setReadTimeout(4567);
6768

6869
URI uri = new URI(baseUrl + "/status/ok");
@@ -75,6 +76,7 @@ public void assertCustomConfig() throws Exception {
7576
RequestConfig.class.isInstance(config));
7677
RequestConfig requestConfig = (RequestConfig) config;
7778
assertEquals("Wrong custom connection timeout", 1234, requestConfig.getConnectTimeout());
79+
assertEquals("Wrong custom connection request timeout", 4321, requestConfig.getConnectionRequestTimeout());
7880
assertEquals("Wrong custom socket timeout", 4567, requestConfig.getSocketTimeout());
7981
}
8082

spring-web/src/test/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutorTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ public void customizeConnectionTimeout() throws IOException {
4343
assertEquals(5000, httpPost.getConfig().getConnectTimeout());
4444
}
4545

46+
@Test
47+
public void customizeConnectionRequestTimeout() throws IOException {
48+
HttpComponentsHttpInvokerRequestExecutor executor = new HttpComponentsHttpInvokerRequestExecutor();
49+
executor.setConnectionRequestTimeout(7000);
50+
51+
HttpInvokerClientConfiguration config = mockHttpInvokerClientConfiguration("http://fake-service");
52+
HttpPost httpPost = executor.createHttpPost(config);
53+
assertEquals(7000, httpPost.getConfig().getConnectionRequestTimeout());
54+
}
55+
4656
@Test
4757
public void customizeReadTimeout() throws IOException {
4858
HttpComponentsHttpInvokerRequestExecutor executor = new HttpComponentsHttpInvokerRequestExecutor();

0 commit comments

Comments
 (0)