From e367c61b89b8230375962a08a9a1c0b0ebc351ae Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 18 May 2018 13:34:48 -0400 Subject: [PATCH] Add remote address to connect exception Today when timing out a connection the exception message is not populated. This is not helpful for end users. This commit adds an exception message that indicates the cause of the connect exception is a timeout to the remote address. --- .../java/org/apache/http/nio/pool/RouteSpecificPool.java | 2 +- .../test/java/org/apache/http/nio/pool/TestNIOConnPool.java | 4 ++++ .../java/org/apache/http/nio/pool/TestRouteSpecificPool.java | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/httpcore-nio/src/main/java/org/apache/http/nio/pool/RouteSpecificPool.java b/httpcore-nio/src/main/java/org/apache/http/nio/pool/RouteSpecificPool.java index b090c1809c..23dc0ffd57 100644 --- a/httpcore-nio/src/main/java/org/apache/http/nio/pool/RouteSpecificPool.java +++ b/httpcore-nio/src/main/java/org/apache/http/nio/pool/RouteSpecificPool.java @@ -171,7 +171,7 @@ public void failed(final SessionRequest request, final Exception ex) { public void timeout(final SessionRequest request) { final BasicFuture future = removeRequest(request); if (future != null) { - future.failed(new ConnectException()); + future.failed(new ConnectException("timeout connecting to [" + request.getRemoteAddress() + "]")); } } diff --git a/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestNIOConnPool.java b/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestNIOConnPool.java index 9314df6528..5d30a9f79c 100644 --- a/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestNIOConnPool.java +++ b/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestNIOConnPool.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.net.ConnectException; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; @@ -278,6 +279,8 @@ public void testTimeoutConnect() throws Exception { final IOSession iosession = Mockito.mock(IOSession.class); final SessionRequest sessionRequest = Mockito.mock(SessionRequest.class); Mockito.when(sessionRequest.getAttachment()).thenReturn("somehost"); + Mockito.when(sessionRequest.getRemoteAddress()) + .thenReturn(new InetSocketAddress(InetAddress.getByAddress(new byte[]{127, 0, 0, 1}), 80)); Mockito.when(sessionRequest.getSession()).thenReturn(iosession); final ConnectingIOReactor ioreactor = Mockito.mock(ConnectingIOReactor.class); Mockito.when(ioreactor.connect( @@ -302,6 +305,7 @@ public void testTimeoutConnect() throws Exception { Assert.fail("ExecutionException should have been thrown"); } catch (final ExecutionException ex) { Assert.assertTrue(ex.getCause() instanceof ConnectException); + Assert.assertEquals("timeout connecting to [/127.0.0.1:80]", ex.getCause().getMessage()); } totals = pool.getTotalStats(); diff --git a/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestRouteSpecificPool.java b/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestRouteSpecificPool.java index f341fa94cf..b55a23bf8e 100644 --- a/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestRouteSpecificPool.java +++ b/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestRouteSpecificPool.java @@ -28,6 +28,8 @@ import java.io.IOException; import java.net.ConnectException; +import java.net.InetAddress; +import java.net.InetSocketAddress; import java.util.concurrent.ExecutionException; import org.apache.http.concurrent.BasicFuture; @@ -158,6 +160,8 @@ public void testCancelledConnect() throws Exception { public void testConnectTimeout() throws Exception { final LocalRoutePool pool = new LocalRoutePool(); final SessionRequest sessionRequest = Mockito.mock(SessionRequest.class); + Mockito.when(sessionRequest.getRemoteAddress()) + .thenReturn(new InetSocketAddress(InetAddress.getByAddress(new byte[]{127, 0, 0, 1}), 80)); final BasicFuture future = new BasicFuture(null); pool.addPending(sessionRequest, future); Assert.assertEquals(1, pool.getAllocatedCount()); @@ -172,6 +176,7 @@ public void testConnectTimeout() throws Exception { Assert.fail("ExecutionException should have been thrown"); } catch (final ExecutionException ex) { Assert.assertTrue(ex.getCause() instanceof ConnectException); + Assert.assertEquals("timeout connecting to [/127.0.0.1:80]", ex.getCause().getMessage()); } Assert.assertEquals(0, pool.getAllocatedCount()); Assert.assertEquals(0, pool.getAvailableCount());