diff --git a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java index d5d73e8f8910..eea1cb720af7 100644 --- a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java +++ b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java @@ -73,6 +73,8 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest private long connectionRequestTimeout = -1; + + private long readTimeout = -1; /** * Create a new instance of the {@code HttpComponentsClientHttpRequestFactory} @@ -136,7 +138,7 @@ public void setConnectTimeout(int connectTimeout) { * handshakes or CONNECT requests; for that, it is required to * use the {@link SocketConfig} on the * {@link HttpClient} itself. - * @param connectTimeout the timeout value in milliseconds + * @param connectTimeout the timeout as {@code Duration}. * @since 6.1 * @see RequestConfig#getConnectTimeout() * @see SocketConfig#getSoTimeout @@ -167,7 +169,7 @@ public void setConnectionRequestTimeout(int connectionRequestTimeout) { * A timeout value of 0 specifies an infinite timeout. *
Additional properties can be configured by specifying a * {@link RequestConfig} instance on a custom {@link HttpClient}. - * @param connectionRequestTimeout the timeout value to request a connection in milliseconds + * @param connectionRequestTimeout the timeout value to request a connection as {@code Duration}. * @since 6.1 * @see RequestConfig#getConnectionRequestTimeout() */ @@ -177,6 +179,43 @@ public void setConnectionRequestTimeout(Duration connectionRequestTimeout) { this.connectionRequestTimeout = connectionRequestTimeout.toMillis(); } + /** + * Set the response timeout for the underlying {@link RequestConfig}. + * A timeout value of 0 specifies an infinite timeout. + *
Additional properties can be configured by specifying a + * {@link RequestConfig} instance on a custom {@link HttpClient}. + *
This options does not affect connection timeouts for SSL + * handshakes or CONNECT requests; for that, it is required to + * use the {@link SocketConfig} on the + * {@link HttpClient} itself. + * @param readTimeout the timeout value in milliseconds + * @since 6.2 + * @see RequestConfig#getResponseTimeout() + */ + public void setReadTimeout(int readTimeout) { + Assert.isTrue(readTimeout >= 0, "Timeout must be a non-negative value"); + this.readTimeout = readTimeout; + } + + /** + * Set the response timeout for the underlying {@link RequestConfig}. + * A timeout value of 0 specifies an infinite timeout. + *
Additional properties can be configured by specifying a + * {@link RequestConfig} instance on a custom {@link HttpClient}. + *
This options does not affect connection timeouts for SSL + * handshakes or CONNECT requests; for that, it is required to + * use the {@link SocketConfig} on the + * {@link HttpClient} itself. + * @param readTimeout the timeout as {@code Duration}. + * @since 6.2 + * @see RequestConfig#getResponseTimeout() + */ + public void setReadTimeout(Duration readTimeout) { + Assert.notNull(readTimeout, "ReadTimeout must not be null"); + Assert.isTrue(!readTimeout.isNegative(), "Timeout must be a non-negative value"); + this.readTimeout = readTimeout.toMillis(); + } + /** * Indicates whether this request factory should buffer the request body internally. *
Default is {@code true}. When sending large amounts of data via POST or PUT, it is @@ -262,7 +301,7 @@ protected RequestConfig createRequestConfig(Object client) { */ @SuppressWarnings("deprecation") // setConnectTimeout protected RequestConfig mergeRequestConfig(RequestConfig clientConfig) { - if (this.connectTimeout == -1 && this.connectionRequestTimeout == -1) { // nothing to merge + if (this.connectTimeout == -1 && this.connectionRequestTimeout == -1 && this.readTimeout == -1) { // nothing to merge return clientConfig; } @@ -273,6 +312,9 @@ protected RequestConfig mergeRequestConfig(RequestConfig clientConfig) { if (this.connectionRequestTimeout >= 0) { builder.setConnectionRequestTimeout(this.connectionRequestTimeout, TimeUnit.MILLISECONDS); } + if (this.readTimeout >= 0) { + builder.setResponseTimeout(this.readTimeout, TimeUnit.MILLISECONDS); + } return builder.build(); }