Skip to content

Commit f51a640

Browse files
committed
Polishing JdkClientHttpRequestFactory
1 parent 48906af commit f51a640

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.net.http.HttpRequest;
2525
import java.net.http.HttpResponse;
2626
import java.nio.ByteBuffer;
27+
import java.time.Duration;
2728
import java.util.List;
2829
import java.util.concurrent.Executor;
2930
import java.util.concurrent.Flow;
@@ -58,12 +59,17 @@ class JdkClientHttpRequest extends AbstractStreamingClientHttpRequest {
5859

5960
private final Executor executor;
6061

62+
@Nullable
63+
private final Duration timeOut;
6164

62-
public JdkClientHttpRequest(HttpClient httpClient, URI uri, HttpMethod method, Executor executor) {
65+
66+
public JdkClientHttpRequest(HttpClient httpClient, URI uri, HttpMethod method, Executor executor,
67+
@Nullable Duration readTimeout) {
6368
this.httpClient = httpClient;
6469
this.uri = uri;
6570
this.method = method;
6671
this.executor = executor;
72+
this.timeOut = readTimeout;
6773
}
6874

6975
@Override
@@ -98,6 +104,10 @@ private HttpRequest buildRequest(HttpHeaders headers, @Nullable Body body) {
98104
HttpRequest.Builder builder = HttpRequest.newBuilder()
99105
.uri(this.uri);
100106

107+
if (this.timeOut != null) {
108+
builder.timeout(this.timeOut);
109+
}
110+
101111
headers.forEach((headerName, headerValues) -> {
102112
if (!headerName.equalsIgnoreCase(HttpHeaders.CONTENT_LENGTH)) {
103113
if (!DISALLOWED_HEADERS.contains(headerName.toLowerCase())) {

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

+17-1
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
import java.io.IOException;
2020
import java.net.URI;
2121
import java.net.http.HttpClient;
22+
import java.time.Duration;
2223
import java.util.concurrent.Executor;
2324

2425
import org.springframework.core.task.SimpleAsyncTaskExecutor;
2526
import org.springframework.http.HttpMethod;
27+
import org.springframework.lang.Nullable;
2628
import org.springframework.util.Assert;
2729

2830

@@ -40,6 +42,9 @@ public class JdkClientHttpRequestFactory implements ClientHttpRequestFactory {
4042

4143
private final Executor executor;
4244

45+
@Nullable
46+
private Duration readTimeout;
47+
4348

4449
/**
4550
* Create a new instance of the {@code JdkClientHttpRequestFactory}
@@ -74,9 +79,20 @@ public JdkClientHttpRequestFactory(HttpClient httpClient, Executor executor) {
7479
}
7580

7681

82+
/**
83+
* Set the underlying {@code HttpClient}'s read timeout (in milliseconds).
84+
* A timeout value of 0 specifies an infinite timeout.
85+
* <p>Default is the system's default timeout.
86+
* @see java.net.http.HttpRequest.Builder#timeout
87+
*/
88+
public void setReadTimeout(int readTimeout) {
89+
this.readTimeout = Duration.ofMillis(readTimeout);
90+
}
91+
92+
7793
@Override
7894
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
79-
return new JdkClientHttpRequest(this.httpClient, uri, httpMethod, this.executor);
95+
return new JdkClientHttpRequest(this.httpClient, uri, httpMethod, this.executor, this.readTimeout);
8096
}
8197

8298
}

0 commit comments

Comments
 (0)