This commit is contained in:
Giampaolo 2025-07-01 19:43:35 +02:00 committed by GitHub
commit ef156e8c8c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 7 additions and 1 deletions

View File

@ -96,12 +96,13 @@ class JdkClientHttpRequest extends AbstractStreamingClientHttpRequest {
@Override @Override
protected ClientHttpResponse executeInternal(HttpHeaders headers, @Nullable Body body) throws IOException { protected ClientHttpResponse executeInternal(HttpHeaders headers, @Nullable Body body) throws IOException {
CompletableFuture<HttpResponse<InputStream>> responseFuture = null; CompletableFuture<HttpResponse<InputStream>> responseFuture = null;
TimeoutHandler timeoutHandler = null;
try { try {
HttpRequest request = buildRequest(headers, body); HttpRequest request = buildRequest(headers, body);
responseFuture = this.httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream()); responseFuture = this.httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream());
if (this.timeout != null) { if (this.timeout != null) {
TimeoutHandler timeoutHandler = new TimeoutHandler(responseFuture, this.timeout); timeoutHandler = new TimeoutHandler(responseFuture, this.timeout);
HttpResponse<InputStream> response = responseFuture.get(); HttpResponse<InputStream> response = responseFuture.get();
InputStream inputStream = timeoutHandler.wrapInputStream(response); InputStream inputStream = timeoutHandler.wrapInputStream(response);
return new JdkClientHttpResponse(response, inputStream); return new JdkClientHttpResponse(response, inputStream);
@ -136,6 +137,9 @@ class JdkClientHttpRequest extends AbstractStreamingClientHttpRequest {
throw (message == null ? new IOException(cause) : new IOException(message, cause)); throw (message == null ? new IOException(cause) : new IOException(message, cause));
} }
} }
catch (CancellationException ex) {
throw new HttpTimeoutException("Request timed out");
}
} }
private HttpRequest buildRequest(HttpHeaders headers, @Nullable Body body) { private HttpRequest buildRequest(HttpHeaders headers, @Nullable Body body) {
@ -233,6 +237,7 @@ class JdkClientHttpRequest extends AbstractStreamingClientHttpRequest {
private static final class TimeoutHandler { private static final class TimeoutHandler {
private final CompletableFuture<Void> timeoutFuture; private final CompletableFuture<Void> timeoutFuture;
private boolean isTimeout=false;
private TimeoutHandler(CompletableFuture<HttpResponse<InputStream>> future, Duration timeout) { private TimeoutHandler(CompletableFuture<HttpResponse<InputStream>> future, Duration timeout) {
@ -241,6 +246,7 @@ class JdkClientHttpRequest extends AbstractStreamingClientHttpRequest {
this.timeoutFuture.thenRun(() -> { this.timeoutFuture.thenRun(() -> {
if (future.cancel(true) || future.isCompletedExceptionally() || !future.isDone()) { if (future.cancel(true) || future.isCompletedExceptionally() || !future.isDone()) {
this.isTimeout = true;
return; return;
} }
try { try {