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));
+ }
}