Skip to content

Commit 7228deb

Browse files
committed
Add builder support for SimpleClientHttpRequestFactory timeouts
- Implemented Builder pattern for configuring connectTimeout and readTimeout - Added tests to verify timeout values are applied on HttpURLConnection Signed-off-by: ‘jminkkk’ <[email protected]>
1 parent ba9bef6 commit 7228deb

File tree

2 files changed

+139
-1
lines changed

2 files changed

+139
-1
lines changed

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

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,31 @@ public class SimpleClientHttpRequestFactory implements ClientHttpRequestFactory
5151

5252
private int readTimeout = -1;
5353

54+
/**
55+
* Private constructor to be used by the Builder.
56+
*/
57+
private SimpleClientHttpRequestFactory(Builder builder) {
58+
this.proxy = builder.proxy;
59+
this.chunkSize = builder.chunkSize;
60+
this.connectTimeout = builder.connectTimeout;
61+
this.readTimeout = builder.readTimeout;
62+
}
63+
64+
/**
65+
* Default constructor.
66+
* Use {@link #builder()} for a fluent API for configuration.
67+
*/
68+
public SimpleClientHttpRequestFactory() {
69+
}
70+
71+
/**
72+
* Creates a new {@code Builder} for {@link SimpleClientHttpRequestFactory}.
73+
* @return a new {@code Builder} instance
74+
* @since 7.0
75+
*/
76+
public static Builder builder() {
77+
return new Builder();
78+
}
5479

5580
/**
5681
* Set the {@link Proxy} to use for this request factory.
@@ -163,4 +188,99 @@ protected void prepareConnection(HttpURLConnection connection, String httpMethod
163188
connection.setRequestMethod(httpMethod);
164189
}
165190

191+
192+
/**
193+
* A builder for {@link SimpleClientHttpRequestFactory}.
194+
* @since 7.0
195+
*/
196+
public static class Builder {
197+
198+
@Nullable
199+
private Proxy proxy;
200+
201+
private int chunkSize = DEFAULT_CHUNK_SIZE;
202+
203+
private int connectTimeout = -1;
204+
205+
private int readTimeout = -1;
206+
207+
/**
208+
* Set the {@link Proxy} to use for this request factory.
209+
* @param proxy the proxy to use
210+
* @return this builder
211+
*/
212+
public Builder proxy(Proxy proxy) {
213+
this.proxy = proxy;
214+
return this;
215+
}
216+
217+
/**
218+
* Set the number of bytes to write in each chunk when not buffering request
219+
* bodies locally.
220+
* @param chunkSize the chunk size
221+
* @return this builder
222+
*/
223+
public Builder chunkSize(int chunkSize) {
224+
this.chunkSize = chunkSize;
225+
return this;
226+
}
227+
228+
/**
229+
* Set the underlying URLConnection's connect timeout (in milliseconds).
230+
* A timeout value of 0 specifies an infinite timeout.
231+
* <p>Default is the system's default timeout.
232+
* @param connectTimeout the connect timeout in milliseconds
233+
* @return this builder
234+
*/
235+
public Builder connectTimeout(int connectTimeout) {
236+
this.connectTimeout = connectTimeout;
237+
return this;
238+
}
239+
240+
/**
241+
* Set the underlying URLConnection's connect timeout as {@code Duration}.
242+
* A timeout value of 0 specifies an infinite timeout.
243+
* <p>Default is the system's default timeout.
244+
* @param connectTimeout the connect timeout duration
245+
* @return this builder
246+
*/
247+
public Builder connectTimeout(Duration connectTimeout) {
248+
Assert.notNull(connectTimeout, "ConnectTimeout must not be null");
249+
this.connectTimeout = (int) connectTimeout.toMillis();
250+
return this;
251+
}
252+
253+
/**
254+
* Set the underlying URLConnection's read timeout (in milliseconds).
255+
* A timeout value of 0 specifies an infinite timeout.
256+
* <p>Default is the system's default timeout.
257+
* @param readTimeout the read timeout in milliseconds
258+
* @return this builder
259+
*/
260+
public Builder readTimeout(int readTimeout) {
261+
this.readTimeout = readTimeout;
262+
return this;
263+
}
264+
265+
/**
266+
* Set the underlying URLConnection's read timeout as {@code Duration}.
267+
* A timeout value of 0 specifies an infinite timeout.
268+
* <p>Default is the system's default timeout.
269+
* @param readTimeout the read timeout duration
270+
* @return this builder
271+
*/
272+
public Builder readTimeout(Duration readTimeout) {
273+
Assert.notNull(readTimeout, "ReadTimeout must not be null");
274+
this.readTimeout = (int) readTimeout.toMillis();
275+
return this;
276+
}
277+
278+
/**
279+
* Builds a new {@link SimpleClientHttpRequestFactory} instance with the configured properties.
280+
* @return a new {@link SimpleClientHttpRequestFactory}
281+
*/
282+
public SimpleClientHttpRequestFactory build() {
283+
return new SimpleClientHttpRequestFactory(this);
284+
}
285+
}
166286
}

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.InputStream;
2222
import java.net.HttpURLConnection;
2323
import java.net.ProtocolException;
24+
import java.net.Proxy;
2425
import java.net.URI;
2526
import java.net.URL;
2627
import java.util.Collections;
@@ -38,7 +39,7 @@
3839
import static org.mockito.Mockito.times;
3940
import static org.mockito.Mockito.verify;
4041

41-
public class SimpleClientHttpRequestFactoryTests extends AbstractHttpRequestFactoryTests {
42+
class SimpleClientHttpRequestFactoryTests extends AbstractHttpRequestFactoryTests {
4243

4344
@Override
4445
protected ClientHttpRequestFactory createRequestFactory() {
@@ -117,6 +118,23 @@ public void headerWithNullValue() {
117118
verify(urlConnection, times(1)).addRequestProperty("foo", "");
118119
}
119120

121+
@Test
122+
void builderShouldApplyConfiguredTimeouts() throws IOException {
123+
Proxy proxy = Proxy.NO_PROXY;
124+
var factory = SimpleClientHttpRequestFactory.builder()
125+
.connectTimeout(1234)
126+
.readTimeout(5678)
127+
.proxy(proxy)
128+
.build();
129+
130+
URL url = new URL("https://example.com");
131+
132+
HttpURLConnection httpURLConnection = factory.openConnection(url, proxy);
133+
factory.prepareConnection(httpURLConnection, "GET");
134+
135+
assertThat(httpURLConnection.getConnectTimeout()).isEqualTo(1234);
136+
assertThat(httpURLConnection.getReadTimeout()).isEqualTo(5678);
137+
}
120138

121139
private static class TestHttpURLConnection extends HttpURLConnection {
122140

0 commit comments

Comments
 (0)