You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2025/05/02 14:06:04 UTC

(httpcomponents-client) 01/01: HTTPCLIENT-2367 - Fix NPE in InternalAbstractHttpAsyncClient by adding null check for resolvedTarget. (#634)

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git

commit f5f9ae8b024c164351210d3cc8fb96858f6b859f
Author: Arturo Bernal <ab...@apache.org>
AuthorDate: Fri May 2 15:52:41 2025 +0200

    HTTPCLIENT-2367 - Fix NPE in InternalAbstractHttpAsyncClient by adding null check for resolvedTarget. (#634)
---
 .../http/impl/async/InternalAbstractHttpAsyncClient.java   | 13 ++++++++-----
 .../hc/client5/http/impl/classic/InternalHttpClient.java   | 12 +++++++-----
 .../client5/http/impl/classic/TestInternalHttpClient.java  | 14 ++++++++++++++
 3 files changed, 29 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 5920ec62b..6c1679604 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 <T> Future<T> 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 4fc06dcd7..07265fcb4 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 ad74b7215..539611f61 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,13 @@
 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.ProtocolException;
 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 +236,15 @@ void testClientCloseIOException() throws Exception {
         Mockito.verify(closeable2).close();
     }
 
+    @Test
+    void testDoExecuteThrowsWhenNoTargetOrHost() throws Exception {
+        final ClassicHttpRequest request = ClassicRequestBuilder.get("/foo").build();
+        final HttpClientContext context = HttpClientContext.create();
+        Mockito.when(routePlanner.determineRoute(
+                Mockito.eq(null),
+                Mockito.any(),
+                Mockito.<HttpClientContext>any())).thenThrow(new ProtocolException());
+        Assertions.assertThrows(ClientProtocolException.class, () ->
+                client.execute(null, request, context));
+    }
 }