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
This commit is contained in:
Stéphane Nicoll 2024-06-07 17:08:49 +02:00
commit 55a7a49863
2 changed files with 24 additions and 2 deletions

View File

@ -21,6 +21,7 @@ import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.ByteBuffer;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
@ -49,6 +50,9 @@ public class JdkClientHttpConnector implements ClientHttpConnector {
private DataBufferFactory bufferFactory = DefaultDataBufferFactory.sharedInstance;
@Nullable
private Duration readTimeout = null;
/**
* Default constructor that uses {@link HttpClient#newHttpClient()}.
@ -91,12 +95,24 @@ public class JdkClientHttpConnector implements ClientHttpConnector {
this.bufferFactory = bufferFactory;
}
/**
* Set the underlying {@code HttpClient}'s read timeout as a {@code Duration}.
* <p>Default is the system's default timeout.
* @since 6.2
* @see java.net.http.HttpRequest.Builder#timeout
*/
public void setReadTimeout(Duration readTimeout) {
Assert.notNull(readTimeout, "readTimeout is required");
this.readTimeout = readTimeout;
}
@Override
public Mono<ClientHttpResponse> connect(
HttpMethod method, URI uri, Function<? super ClientHttpRequest, Mono<Void>> requestCallback) {
JdkClientHttpRequest jdkClientHttpRequest = new JdkClientHttpRequest(method, uri, this.bufferFactory);
JdkClientHttpRequest jdkClientHttpRequest = new JdkClientHttpRequest(method, uri, this.bufferFactory,
this.readTimeout);
return requestCallback.apply(jdkClientHttpRequest).then(Mono.defer(() -> {
HttpRequest httpRequest = jdkClientHttpRequest.getNativeRequest();

View File

@ -20,6 +20,7 @@ import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.nio.ByteBuffer;
import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Flow;
@ -36,6 +37,7 @@ import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;
@ -57,7 +59,8 @@ class JdkClientHttpRequest extends AbstractClientHttpRequest {
private final HttpRequest.Builder builder;
public JdkClientHttpRequest(HttpMethod httpMethod, URI uri, DataBufferFactory bufferFactory) {
public JdkClientHttpRequest(HttpMethod httpMethod, URI uri, DataBufferFactory bufferFactory,
@Nullable Duration readTimeout) {
Assert.notNull(httpMethod, "HttpMethod is required");
Assert.notNull(uri, "URI is required");
Assert.notNull(bufferFactory, "DataBufferFactory is required");
@ -66,6 +69,9 @@ class JdkClientHttpRequest extends AbstractClientHttpRequest {
this.uri = uri;
this.bufferFactory = bufferFactory;
this.builder = HttpRequest.newBuilder(uri);
if (readTimeout != null) {
this.builder.timeout(readTimeout);
}
}