From 3515abf35c20d2c539805d4ca569215bccdccc77 Mon Sep 17 00:00:00 2001 From: Arturo Bernal Date: Thu, 1 May 2025 14:02:47 +0200 Subject: [PATCH] HTTPCLIENT-2367 - Fix NPE in InternalAbstractHttpAsyncClient by adding null check for resolvedTarget. --- .../impl/async/InternalAbstractHttpAsyncClient.java | 13 ++++++++----- .../http/impl/classic/InternalHttpClient.java | 12 +++++++----- .../http/impl/classic/TestInternalHttpClient.java | 9 +++++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalAbstractHttpAsyncClient.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalAbstractHttpAsyncClient.java index 5920ec62be..6c1679604f 100644 --- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalAbstractHttpAsyncClient.java +++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalAbstractHttpAsyncClient.java @@ -219,12 +219,15 @@ protected Future doExecute( setupContext(clientContext); final HttpHost resolvedTarget = target != null ? target : RoutingSupport.determineHost(request); - if (request.getScheme() == null) { - request.setScheme(resolvedTarget.getSchemeName()); - } - if (request.getAuthority() == null) { - request.setAuthority(new URIAuthority(resolvedTarget)); + if (resolvedTarget != null) { + if (request.getScheme() == null) { + request.setScheme(resolvedTarget.getSchemeName()); + } + if (request.getAuthority() == null) { + request.setAuthority(new URIAuthority(resolvedTarget)); + } } + final HttpRoute route = determineRoute( resolvedTarget, request, diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalHttpClient.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalHttpClient.java index 4fc06dcd70..07265fcb4b 100644 --- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalHttpClient.java +++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalHttpClient.java @@ -161,11 +161,13 @@ protected CloseableHttpResponse doExecute( setupContext(localcontext); final HttpHost resolvedTarget = target != null ? target : RoutingSupport.determineHost(request); - if (request.getScheme() == null) { - request.setScheme(resolvedTarget.getSchemeName()); - } - if (request.getAuthority() == null) { - request.setAuthority(new URIAuthority(resolvedTarget)); + if (resolvedTarget != null) { + if (request.getScheme() == null) { + request.setScheme(resolvedTarget.getSchemeName()); + } + if (request.getAuthority() == null) { + request.setAuthority(new URIAuthority(resolvedTarget)); + } } final HttpRoute route = determineRoute( resolvedTarget, diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestInternalHttpClient.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestInternalHttpClient.java index ad74b7215e..bd7e8bfb6f 100644 --- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestInternalHttpClient.java +++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestInternalHttpClient.java @@ -42,10 +42,12 @@ import org.apache.hc.client5.http.io.HttpClientConnectionManager; import org.apache.hc.client5.http.protocol.HttpClientContext; import org.apache.hc.client5.http.routing.HttpRoutePlanner; +import org.apache.hc.core5.http.ClassicHttpRequest; import org.apache.hc.core5.http.HttpException; import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.config.Lookup; import org.apache.hc.core5.http.impl.io.HttpRequestExecutor; +import org.apache.hc.core5.http.io.support.ClassicRequestBuilder; import org.apache.hc.core5.http.message.BasicClassicHttpResponse; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -233,4 +235,11 @@ void testClientCloseIOException() throws Exception { Mockito.verify(closeable2).close(); } + @Test + void testDoExecuteThrowsWhenNoTargetOrHost() { + final ClassicHttpRequest request = ClassicRequestBuilder.get("/foo").build(); + final HttpClientContext context = HttpClientContext.create(); + Assertions.assertThrows(NullPointerException.class, () -> + client.execute(null, request, context)); + } }