Skip to content

Commit f5f9ae8

Browse files
arturobernalgok2c
authored andcommitted
HTTPCLIENT-2367 - Fix NPE in InternalAbstractHttpAsyncClient by adding null check for resolvedTarget. (#634)
1 parent 19c0278 commit f5f9ae8

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalAbstractHttpAsyncClient.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,15 @@ protected <T> Future<T> doExecute(
219219
setupContext(clientContext);
220220

221221
final HttpHost resolvedTarget = target != null ? target : RoutingSupport.determineHost(request);
222-
if (request.getScheme() == null) {
223-
request.setScheme(resolvedTarget.getSchemeName());
224-
}
225-
if (request.getAuthority() == null) {
226-
request.setAuthority(new URIAuthority(resolvedTarget));
222+
if (resolvedTarget != null) {
223+
if (request.getScheme() == null) {
224+
request.setScheme(resolvedTarget.getSchemeName());
225+
}
226+
if (request.getAuthority() == null) {
227+
request.setAuthority(new URIAuthority(resolvedTarget));
228+
}
227229
}
230+
228231
final HttpRoute route = determineRoute(
229232
resolvedTarget,
230233
request,

httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalHttpClient.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,13 @@ protected CloseableHttpResponse doExecute(
161161
setupContext(localcontext);
162162

163163
final HttpHost resolvedTarget = target != null ? target : RoutingSupport.determineHost(request);
164-
if (request.getScheme() == null) {
165-
request.setScheme(resolvedTarget.getSchemeName());
166-
}
167-
if (request.getAuthority() == null) {
168-
request.setAuthority(new URIAuthority(resolvedTarget));
164+
if (resolvedTarget != null) {
165+
if (request.getScheme() == null) {
166+
request.setScheme(resolvedTarget.getSchemeName());
167+
}
168+
if (request.getAuthority() == null) {
169+
request.setAuthority(new URIAuthority(resolvedTarget));
170+
}
169171
}
170172
final HttpRoute route = determineRoute(
171173
resolvedTarget,

httpclient5/src/test/java/org/apache/hc/client5/http/impl/classic/TestInternalHttpClient.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,13 @@
4242
import org.apache.hc.client5.http.io.HttpClientConnectionManager;
4343
import org.apache.hc.client5.http.protocol.HttpClientContext;
4444
import org.apache.hc.client5.http.routing.HttpRoutePlanner;
45+
import org.apache.hc.core5.http.ClassicHttpRequest;
4546
import org.apache.hc.core5.http.HttpException;
4647
import org.apache.hc.core5.http.HttpHost;
48+
import org.apache.hc.core5.http.ProtocolException;
4749
import org.apache.hc.core5.http.config.Lookup;
4850
import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
51+
import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
4952
import org.apache.hc.core5.http.message.BasicClassicHttpResponse;
5053
import org.junit.jupiter.api.Assertions;
5154
import org.junit.jupiter.api.BeforeEach;
@@ -233,4 +236,15 @@ void testClientCloseIOException() throws Exception {
233236
Mockito.verify(closeable2).close();
234237
}
235238

239+
@Test
240+
void testDoExecuteThrowsWhenNoTargetOrHost() throws Exception {
241+
final ClassicHttpRequest request = ClassicRequestBuilder.get("/foo").build();
242+
final HttpClientContext context = HttpClientContext.create();
243+
Mockito.when(routePlanner.determineRoute(
244+
Mockito.eq(null),
245+
Mockito.any(),
246+
Mockito.<HttpClientContext>any())).thenThrow(new ProtocolException());
247+
Assertions.assertThrows(ClientProtocolException.class, () ->
248+
client.execute(null, request, context));
249+
}
236250
}

0 commit comments

Comments
 (0)