Handle zero readTimeout in JdkClientHttpRequestFactory

Closes gh-37232

Signed-off-by: Tran Ngoc Nhan <ngocnhan.tran1996@gmail.com>
This commit is contained in:
Tran Ngoc Nhan
2026-09-04 17:05:12 +02:00
committed by Brian Clozel
parent 2d478f7d9b
commit 85c8bb674c
2 changed files with 25 additions and 2 deletions
@@ -86,7 +86,7 @@ public class JdkClientHttpRequestFactory implements ClientHttpRequestFactory {
* @see java.net.http.HttpRequest.Builder#timeout * @see java.net.http.HttpRequest.Builder#timeout
*/ */
public void setReadTimeout(int readTimeout) { 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 * @see java.net.http.HttpRequest.Builder#timeout
*/ */
public void setReadTimeout(Duration readTimeout) { public void setReadTimeout(Duration readTimeout) {
this.readTimeout = readTimeout; this.readTimeout = Duration.ZERO.equals(readTimeout) ? null : readTimeout;
} }
/** /**
@@ -19,6 +19,7 @@ package org.springframework.http.client;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.Duration;
import org.jspecify.annotations.Nullable; import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterAll; 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 @Test
void compressionDisabled() throws IOException { void compressionDisabled() throws IOException {
URI uri = URI.create(baseUrl + "/compress/"); URI uri = URI.create(baseUrl + "/compress/");