diff --git a/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestSender.java b/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestSender.java index 3dc1541ef0..e97025664f 100755 --- a/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestSender.java +++ b/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestSender.java @@ -344,14 +344,14 @@ private Future> resolveAddresses(Request request, } else { int port = uri.getExplicitPort(); + InetSocketAddress unresolvedRemoteAddress = InetSocketAddress.createUnresolved(uri.getHost(), port); + scheduleRequestTimeout(future, unresolvedRemoteAddress); + if (request.getAddress() != null) { // bypass resolution InetSocketAddress inetSocketAddress = new InetSocketAddress(request.getAddress(), port); return promise.setSuccess(singletonList(inetSocketAddress)); - } else { - InetSocketAddress unresolvedRemoteAddress = InetSocketAddress.createUnresolved(uri.getHost(), port); - scheduleRequestTimeout(future, unresolvedRemoteAddress); return RequestHostnameResolver.INSTANCE.resolve(request.getNameResolver(), unresolvedRemoteAddress, asyncHandler); } } diff --git a/client/src/test/java/org/asynchttpclient/CustomRemoteAddressTest.java b/client/src/test/java/org/asynchttpclient/CustomRemoteAddressTest.java new file mode 100755 index 0000000000..c4b8026440 --- /dev/null +++ b/client/src/test/java/org/asynchttpclient/CustomRemoteAddressTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016 AsyncHttpClient Project. All rights reserved. + * + * This program is licensed to you under the Apache License Version 2.0, + * and you may not use this file except in compliance with the Apache License Version 2.0. + * You may obtain a copy of the Apache License Version 2.0 at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the Apache License Version 2.0 is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Apache License Version 2.0 for the specific language governing permissions and limitations there under. + */ +package org.asynchttpclient; + +import io.netty.util.internal.SocketUtils; +import org.asynchttpclient.test.TestUtils.AsyncCompletionHandlerAdapter; +import org.asynchttpclient.testserver.HttpServer; +import org.asynchttpclient.testserver.HttpTest; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.asynchttpclient.Dsl.get; +import static org.asynchttpclient.test.TestUtils.TIMEOUT; +import static org.testng.Assert.assertEquals; + +public class CustomRemoteAddressTest extends HttpTest { + + private static HttpServer server; + + @BeforeClass + public static void start() throws Throwable { + server = new HttpServer(); + server.start(); + } + + @AfterClass + public static void stop() throws Throwable { + server.close(); + } + + @Test + public void getRootUrlWithCustomRemoteAddress() throws Throwable { + withClient().run(client -> + withServer(server).run(server -> { + String url = server.getHttpUrl(); + server.enqueueOk(); + RequestBuilder request = get(url).setAddress(SocketUtils.addressByName("localhost")); + Response response = client.executeRequest(request, new AsyncCompletionHandlerAdapter()).get(TIMEOUT, SECONDS); + assertEquals(response.getStatusCode(), 200); + })); + } +}