Skip to content

Commit 55a7a49

Browse files
committed
Merge pull request #32941 from m4tt30c91
* pr/32941: Polish contribution Add support for specifying a read timeout for the reactive jdk client Closes gh-32941
2 parents 7916f74 + 329b533 commit 55a7a49

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

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

+17-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.net.http.HttpRequest;
2222
import java.net.http.HttpResponse;
2323
import java.nio.ByteBuffer;
24+
import java.time.Duration;
2425
import java.util.List;
2526
import java.util.concurrent.CompletableFuture;
2627
import java.util.concurrent.Executor;
@@ -49,6 +50,9 @@ public class JdkClientHttpConnector implements ClientHttpConnector {
4950

5051
private DataBufferFactory bufferFactory = DefaultDataBufferFactory.sharedInstance;
5152

53+
@Nullable
54+
private Duration readTimeout = null;
55+
5256

5357
/**
5458
* Default constructor that uses {@link HttpClient#newHttpClient()}.
@@ -91,12 +95,24 @@ public void setBufferFactory(DataBufferFactory bufferFactory) {
9195
this.bufferFactory = bufferFactory;
9296
}
9397

98+
/**
99+
* Set the underlying {@code HttpClient}'s read timeout as a {@code Duration}.
100+
* <p>Default is the system's default timeout.
101+
* @since 6.2
102+
* @see java.net.http.HttpRequest.Builder#timeout
103+
*/
104+
public void setReadTimeout(Duration readTimeout) {
105+
Assert.notNull(readTimeout, "readTimeout is required");
106+
this.readTimeout = readTimeout;
107+
}
108+
94109

95110
@Override
96111
public Mono<ClientHttpResponse> connect(
97112
HttpMethod method, URI uri, Function<? super ClientHttpRequest, Mono<Void>> requestCallback) {
98113

99-
JdkClientHttpRequest jdkClientHttpRequest = new JdkClientHttpRequest(method, uri, this.bufferFactory);
114+
JdkClientHttpRequest jdkClientHttpRequest = new JdkClientHttpRequest(method, uri, this.bufferFactory,
115+
this.readTimeout);
100116

101117
return requestCallback.apply(jdkClientHttpRequest).then(Mono.defer(() -> {
102118
HttpRequest httpRequest = jdkClientHttpRequest.getNativeRequest();

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.net.http.HttpClient;
2121
import java.net.http.HttpRequest;
2222
import java.nio.ByteBuffer;
23+
import java.time.Duration;
2324
import java.util.List;
2425
import java.util.Map;
2526
import java.util.concurrent.Flow;
@@ -36,6 +37,7 @@
3637
import org.springframework.http.HttpCookie;
3738
import org.springframework.http.HttpHeaders;
3839
import org.springframework.http.HttpMethod;
40+
import org.springframework.lang.Nullable;
3941
import org.springframework.util.Assert;
4042
import org.springframework.util.MultiValueMap;
4143

@@ -57,7 +59,8 @@ class JdkClientHttpRequest extends AbstractClientHttpRequest {
5759
private final HttpRequest.Builder builder;
5860

5961

60-
public JdkClientHttpRequest(HttpMethod httpMethod, URI uri, DataBufferFactory bufferFactory) {
62+
public JdkClientHttpRequest(HttpMethod httpMethod, URI uri, DataBufferFactory bufferFactory,
63+
@Nullable Duration readTimeout) {
6164
Assert.notNull(httpMethod, "HttpMethod is required");
6265
Assert.notNull(uri, "URI is required");
6366
Assert.notNull(bufferFactory, "DataBufferFactory is required");
@@ -66,6 +69,9 @@ public JdkClientHttpRequest(HttpMethod httpMethod, URI uri, DataBufferFactory bu
6669
this.uri = uri;
6770
this.bufferFactory = bufferFactory;
6871
this.builder = HttpRequest.newBuilder(uri);
72+
if (readTimeout != null) {
73+
this.builder.timeout(readTimeout);
74+
}
6975
}
7076

7177

0 commit comments

Comments
 (0)