Skip to content

Commit 72301dc

Browse files
committed
Add Duration variants for ClientHttpRequestFactory timeouts
This commit adds overloaded variants of timeout setters that take a Duration instead of a number.
1 parent 84e863f commit 72301dc

File tree

6 files changed

+132
-7
lines changed

6 files changed

+132
-7
lines changed

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

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.Closeable;
2020
import java.io.IOException;
2121
import java.net.URI;
22+
import java.time.Duration;
2223
import java.util.concurrent.TimeUnit;
2324
import java.util.function.BiFunction;
2425

@@ -68,9 +69,9 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest
6869
@Nullable
6970
private BiFunction<HttpMethod, URI, HttpContext> httpContextFactory;
7071

71-
private int connectTimeout = -1;
72+
private long connectTimeout = -1;
7273

73-
private int connectionRequestTimeout = -1;
74+
private long connectionRequestTimeout = -1;
7475

7576
/**
7677
* Create a new instance of the {@code HttpComponentsClientHttpRequestFactory}
@@ -125,6 +126,26 @@ public void setConnectTimeout(int connectTimeout) {
125126
this.connectTimeout = connectTimeout;
126127
}
127128

129+
/**
130+
* Set the connection timeout for the underlying {@link RequestConfig}.
131+
* A timeout value of 0 specifies an infinite timeout.
132+
* <p>Additional properties can be configured by specifying a
133+
* {@link RequestConfig} instance on a custom {@link HttpClient}.
134+
* <p>This options does not affect connection timeouts for SSL
135+
* handshakes or CONNECT requests; for that, it is required to
136+
* use the {@link SocketConfig} on the
137+
* {@link HttpClient} itself.
138+
* @param connectTimeout the timeout value in milliseconds
139+
* @since 6.1
140+
* @see RequestConfig#getConnectTimeout()
141+
* @see SocketConfig#getSoTimeout
142+
*/
143+
public void setConnectTimeout(Duration connectTimeout) {
144+
Assert.notNull(connectTimeout, "ConnectTimeout must not be null");
145+
Assert.isTrue(!connectTimeout.isNegative(), "Timeout must be a non-negative value");
146+
this.connectTimeout = connectTimeout.toMillis();
147+
}
148+
128149
/**
129150
* Set the timeout in milliseconds used when requesting a connection
130151
* from the connection manager using the underlying {@link RequestConfig}.
@@ -139,6 +160,22 @@ public void setConnectionRequestTimeout(int connectionRequestTimeout) {
139160
this.connectionRequestTimeout = connectionRequestTimeout;
140161
}
141162

163+
/**
164+
* Set the timeout in milliseconds used when requesting a connection
165+
* from the connection manager using the underlying {@link RequestConfig}.
166+
* A timeout value of 0 specifies an infinite timeout.
167+
* <p>Additional properties can be configured by specifying a
168+
* {@link RequestConfig} instance on a custom {@link HttpClient}.
169+
* @param connectionRequestTimeout the timeout value to request a connection in milliseconds
170+
* @since 6.1
171+
* @see RequestConfig#getConnectionRequestTimeout()
172+
*/
173+
public void setConnectionRequestTimeout(Duration connectionRequestTimeout) {
174+
Assert.notNull(connectionRequestTimeout, "ConnectionRequestTimeout must not be null");
175+
Assert.isTrue(!connectionRequestTimeout.isNegative(), "Timeout must be a non-negative value");
176+
this.connectionRequestTimeout = connectionRequestTimeout.toMillis();
177+
}
178+
142179
/**
143180
* Indicates whether this request factory should buffer the request body internally.
144181
* <p>Default is {@code true}. When sending large amounts of data via POST or PUT, it is

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,17 @@ public void setReadTimeout(int readTimeout) {
8989
this.readTimeout = Duration.ofMillis(readTimeout);
9090
}
9191

92+
/**
93+
* Set the underlying {@code HttpClient}'s read timeout as a
94+
* {@code Duration}.
95+
* <p>Default is the system's default timeout.
96+
* @see java.net.http.HttpRequest.Builder#timeout
97+
*/
98+
public void setReadTimeout(Duration readTimeout) {
99+
Assert.notNull(readTimeout, "ReadTimeout must not be null");
100+
this.readTimeout = readTimeout;
101+
}
102+
92103

93104
@Override
94105
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ class JettyClientHttpRequest extends AbstractStreamingClientHttpRequest {
4646

4747
private final Request request;
4848

49-
private final int readTimeout;
49+
private final long readTimeout;
5050

5151

52-
public JettyClientHttpRequest(Request request, int readTimeout) {
52+
public JettyClientHttpRequest(Request request, long readTimeout) {
5353
this.request = request;
5454
this.readTimeout = readTimeout;
5555
}

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.IOException;
2020
import java.net.URI;
21+
import java.time.Duration;
2122

2223
import org.eclipse.jetty.client.HttpClient;
2324
import org.eclipse.jetty.client.api.Request;
@@ -40,7 +41,7 @@ public class JettyClientHttpRequestFactory implements ClientHttpRequestFactory,
4041

4142
private final boolean defaultClient;
4243

43-
private int readTimeout = 1000;
44+
private long readTimeout = 1000;
4445

4546

4647
/**
@@ -66,21 +67,37 @@ private JettyClientHttpRequestFactory(HttpClient httpClient, boolean defaultClie
6667

6768
/**
6869
* Set the underlying connect timeout in milliseconds.
69-
* A value of 0 specifies an infinite timeout.
7070
*/
7171
public void setConnectTimeout(int connectTimeout) {
7272
Assert.isTrue(connectTimeout >= 0, "Timeout must be a non-negative value");
7373
this.httpClient.setConnectTimeout(connectTimeout);
7474
}
7575

76+
/**
77+
* Set the underlying connect timeout in milliseconds.
78+
* A value of 0 specifies an infinite timeout.
79+
*/
80+
public void setConnectTimeout(Duration connectTimeout) {
81+
Assert.notNull(connectTimeout, "ConnectTimeout must not be null");
82+
this.httpClient.setConnectTimeout(connectTimeout.toMillis());
83+
}
84+
7685
/**
7786
* Set the underlying read timeout in milliseconds.
7887
*/
79-
public void setReadTimeout(int readTimeout) {
88+
public void setReadTimeout(long readTimeout) {
8089
Assert.isTrue(readTimeout > 0, "Timeout must be a positive value");
8190
this.readTimeout = readTimeout;
8291
}
8392

93+
/**
94+
* Set the underlying read timeout as {@code Duration}.
95+
*/
96+
public void setReadTimeout(Duration readTimeout) {
97+
Assert.notNull(readTimeout, "ReadTimeout must not be null");
98+
this.readTimeout = readTimeout.toMillis();
99+
}
100+
84101
@Override
85102
public void afterPropertiesSet() throws Exception {
86103
startHttpClient();

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.IOException;
2020
import java.net.URI;
21+
import java.time.Duration;
2122
import java.util.concurrent.TimeUnit;
2223

2324
import okhttp3.Cache;
@@ -72,6 +73,17 @@ public void setReadTimeout(int readTimeout) {
7273
.build();
7374
}
7475

76+
/**
77+
* Set the underlying read timeout in milliseconds.
78+
* A value of 0 specifies an infinite timeout.
79+
* @since 6.1
80+
*/
81+
public void setReadTimeout(Duration readTimeout) {
82+
this.client = this.client.newBuilder()
83+
.readTimeout(readTimeout)
84+
.build();
85+
}
86+
7587
/**
7688
* Set the underlying write timeout in milliseconds.
7789
* A value of 0 specifies an infinite timeout.
@@ -82,6 +94,17 @@ public void setWriteTimeout(int writeTimeout) {
8294
.build();
8395
}
8496

97+
/**
98+
* Set the underlying write timeout in milliseconds.
99+
* A value of 0 specifies an infinite timeout.
100+
* @since 6.1
101+
*/
102+
public void setWriteTimeout(Duration writeTimeout) {
103+
this.client = this.client.newBuilder()
104+
.writeTimeout(writeTimeout)
105+
.build();
106+
}
107+
85108
/**
86109
* Set the underlying connect timeout in milliseconds.
87110
* A value of 0 specifies an infinite timeout.
@@ -92,6 +115,17 @@ public void setConnectTimeout(int connectTimeout) {
92115
.build();
93116
}
94117

118+
/**
119+
* Set the underlying connect timeout in milliseconds.
120+
* A value of 0 specifies an infinite timeout.
121+
* @since 6.1
122+
*/
123+
public void setConnectTimeout(Duration connectTimeout) {
124+
this.client = this.client.newBuilder()
125+
.connectTimeout(connectTimeout)
126+
.build();
127+
}
128+
95129

96130
@Override
97131
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) {

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
import java.net.URI;
2323
import java.net.URL;
2424
import java.net.URLConnection;
25+
import java.time.Duration;
2526

2627
import org.springframework.http.HttpMethod;
2728
import org.springframework.lang.Nullable;
29+
import org.springframework.util.Assert;
2830

2931
/**
3032
* {@link ClientHttpRequestFactory} implementation that uses standard JDK facilities.
@@ -98,6 +100,18 @@ public void setConnectTimeout(int connectTimeout) {
98100
this.connectTimeout = connectTimeout;
99101
}
100102

103+
/**
104+
* Set the underlying URLConnection's connect timeout as {@code Duration}.
105+
* A timeout value of 0 specifies an infinite timeout.
106+
* <p>Default is the system's default timeout.
107+
* @since 6.1
108+
* @see URLConnection#setConnectTimeout(int)
109+
*/
110+
public void setConnectTimeout(Duration connectTimeout) {
111+
Assert.notNull(connectTimeout, "ConnectTimeout must not be null");
112+
this.connectTimeout = (int) connectTimeout.toMillis();
113+
}
114+
101115
/**
102116
* Set the underlying URLConnection's read timeout (in milliseconds).
103117
* A timeout value of 0 specifies an infinite timeout.
@@ -108,6 +122,18 @@ public void setReadTimeout(int readTimeout) {
108122
this.readTimeout = readTimeout;
109123
}
110124

125+
/**
126+
* Set the underlying URLConnection's read timeout (in milliseconds).
127+
* A timeout value of 0 specifies an infinite timeout.
128+
* <p>Default is the system's default timeout.
129+
* @since 6.1
130+
* @see URLConnection#setReadTimeout(int)
131+
*/
132+
public void setReadTimeout(Duration readTimeout) {
133+
Assert.notNull(readTimeout, "ReadTimeout must not be null");
134+
this.readTimeout = (int) readTimeout.toMillis();
135+
}
136+
111137
/**
112138
* Set if the underlying URLConnection can be set to 'output streaming' mode.
113139
* Default is {@code true}.

0 commit comments

Comments
 (0)