From 85c8bb674cd7dbef46f172da8b7fc048f45f53be Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Fri, 4 Sep 2026 01:53:20 +0700 Subject: [PATCH] Handle zero readTimeout in JdkClientHttpRequestFactory Closes gh-37232 Signed-off-by: Tran Ngoc Nhan --- .../client/JdkClientHttpRequestFactory.java | 4 ++-- .../JdkClientHttpRequestFactoryTests.java | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequestFactory.java b/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequestFactory.java index 14dec7ffa51..b6c25979278 100644 --- a/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequestFactory.java +++ b/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequestFactory.java @@ -86,7 +86,7 @@ public class JdkClientHttpRequestFactory implements ClientHttpRequestFactory { * @see java.net.http.HttpRequest.Builder#timeout */ public void setReadTimeout(int readTimeout) { - this.readTimeout = Duration.ofMillis(readTimeout); + this.readTimeout = readTimeout == 0 ? null : Duration.ofMillis(readTimeout); } /** @@ -95,7 +95,7 @@ public class JdkClientHttpRequestFactory implements ClientHttpRequestFactory { * @see java.net.http.HttpRequest.Builder#timeout */ public void setReadTimeout(Duration readTimeout) { - this.readTimeout = readTimeout; + this.readTimeout = Duration.ZERO.equals(readTimeout) ? null : readTimeout; } /** diff --git a/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java b/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java index f82ede88255..f44246b3d8a 100644 --- a/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java +++ b/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java @@ -19,6 +19,7 @@ package org.springframework.http.client; import java.io.IOException; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.time.Duration; import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.AfterAll; @@ -109,6 +110,28 @@ class JdkClientHttpRequestFactoryTests extends AbstractHttpRequestFactoryTests { } } + @Test + void readTimeoutZeroShouldNotThrowException() throws Exception { + ((JdkClientHttpRequestFactory) factory).setReadTimeout(0); + URI uri = URI.create(this.baseUrl + "/methods/get"); + ClientHttpRequest request = + new BufferingClientHttpRequestFactory(this.factory).createRequest(uri, HttpMethod.GET); + try (ClientHttpResponse response = request.execute()) { + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + } + } + + @Test + void readTimeoutDurationZeroShouldNotThrowException() throws Exception { + ((JdkClientHttpRequestFactory) factory).setReadTimeout(Duration.ZERO); + URI uri = URI.create(this.baseUrl + "/methods/get"); + ClientHttpRequest request = + new BufferingClientHttpRequestFactory(this.factory).createRequest(uri, HttpMethod.GET); + try (ClientHttpResponse response = request.execute()) { + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + } + } + @Test void compressionDisabled() throws IOException { URI uri = URI.create(baseUrl + "/compress/");