[ 
https://issues.apache.org/jira/browse/HTTPCLIENT-2013?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16914957#comment-16914957
 ] 

Oleg Kalnichevski commented on HTTPCLIENT-2013:
-----------------------------------------------

I revisited connect exception handling code in master and cleaned up things 
making sure that all classic and async client implementations handle connect 
failures the same way.

[https://github.com/apache/httpcomponents-client/commit/e0c1c140d574872ba20574edd6eb941cc072d761]

At the same time I found that the actual logic in 4.5 and 5.0 was reasonable 
and decided to not make any major changes (other than making 
{{ConnectTimeoutException}} extend {{SocketTimeoutException}} and eliminating 
unnecessary exception chaining).

Most of the time JREs do the right thing and throw {{SocketTimeoutException}}. 
If for whatever reason some JREs decide to throw {{ConnectException}} instead, 
HttpClient will make an effort to correct it but it is still just guess-work 
based on exception message text.

[~francium25] The only way of fixing the problem properly is to fix it as the 
source. So, I am sure you will be right on track reporting this issue to 
OpenJDK.

Oleg
 —
 java version "1.7.0_75"
 Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
 Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)
{noformat}
Exception in thread "main" org.apache.hc.client5.http.ConnectTimeoutException: 
Connect to http://httpbin.org:80 [httpbin.org/52.22.188.80, 
httpbin.org/3.223.234.9] failed: connect timed out
        at 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:160)
        at 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:409)
        at 
org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint(InternalExecRuntime.java:164)
        at 
org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint(InternalExecRuntime.java:174)
        at 
org.apache.hc.client5.http.impl.classic.ConnectExec.execute(ConnectExec.java:135)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ProtocolExec.java:165)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.RetryExec.execute(RetryExec.java:88)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.RedirectExec.execute(RedirectExec.java:116)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.ContentCompressionExec.execute(ContentCompressionExec.java:128)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(InternalHttpClient.java:178)
        at 
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:77)
        at 
org.apache.hc.client5.http.examples.QuickStart.main(QuickStart.java:55)
Caused by: java.net.SocketTimeoutException: connect timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at 
java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at 
java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at 
java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at 
org.apache.hc.client5.http.socket.PlainConnectionSocketFactory$1.run(PlainConnectionSocketFactory.java:87)
        at java.security.AccessController.doPrivileged(Native Method)
        at 
org.apache.hc.client5.http.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:84)
        at 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:152)
        ... 20 more
{noformat}
java version "1.8.0_181"
 Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
 Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
{noformat}
Exception in thread "main" org.apache.hc.client5.http.ConnectTimeoutException: 
Connect to http://httpbin.org:80 [httpbin.org/52.22.188.80, 
httpbin.org/3.223.234.9] failed: connect timed out
        at 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:160)
        at 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:409)
        at 
org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint(InternalExecRuntime.java:164)
        at 
org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint(InternalExecRuntime.java:174)
        at 
org.apache.hc.client5.http.impl.classic.ConnectExec.execute(ConnectExec.java:135)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ProtocolExec.java:165)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.RetryExec.execute(RetryExec.java:88)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.RedirectExec.execute(RedirectExec.java:116)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.ContentCompressionExec.execute(ContentCompressionExec.java:128)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(InternalHttpClient.java:178)
        at 
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:77)
        at 
org.apache.hc.client5.http.examples.QuickStart.main(QuickStart.java:55)
Caused by: java.net.SocketTimeoutException: connect timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at 
java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at 
java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at 
java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at 
org.apache.hc.client5.http.socket.PlainConnectionSocketFactory$1.run(PlainConnectionSocketFactory.java:87)
        at java.security.AccessController.doPrivileged(Native Method)
        at 
org.apache.hc.client5.http.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:84)
        at 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:152)
        ... 20 more
{noformat}
java version "11.0.3" 2019-04-16 LTS
 Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
 Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)
{noformat}
Exception in thread "main" org.apache.hc.client5.http.ConnectTimeoutException: 
Connect to http://httpbin.org:80 [httpbin.org/3.223.234.9, 
httpbin.org/52.22.188.80] failed: connect timed out
        at 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:160)
        at 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:409)
        at 
org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint(InternalExecRuntime.java:164)
        at 
org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint(InternalExecRuntime.java:174)
        at 
org.apache.hc.client5.http.impl.classic.ConnectExec.execute(ConnectExec.java:135)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ProtocolExec.java:165)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.RetryExec.execute(RetryExec.java:88)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.RedirectExec.execute(RedirectExec.java:116)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ExecChainElement.java:57)
        at 
org.apache.hc.client5.http.impl.classic.ContentCompressionExec.execute(ContentCompressionExec.java:128)
        at 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
        at 
org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(InternalHttpClient.java:178)
        at 
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:77)
        at 
org.apache.hc.client5.http.examples.QuickStart.main(QuickStart.java:55)
Caused by: java.net.SocketTimeoutException: connect timed out
        at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
        at 
java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
        at 
java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
        at 
java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
        at java.base/java.net.Socket.connect(Socket.java:591)
        at 
org.apache.hc.client5.http.socket.PlainConnectionSocketFactory$1.run(PlainConnectionSocketFactory.java:87)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at 
org.apache.hc.client5.http.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:84)
        at 
org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:152){noformat}

> Connect timeout throws HttpHostConnectException (ConnectException) instead of 
> ConnectTimeoutException (IOException)
> -------------------------------------------------------------------------------------------------------------------
>
>                 Key: HTTPCLIENT-2013
>                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2013
>             Project: HttpComponents HttpClient
>          Issue Type: Improvement
>          Components: HttpClient (classic)
>    Affects Versions: 4.5.9
>         Environment: Linux
> openjdk version "1.8.0_222"
> OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1-b10)
> OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
>            Reporter: Chanseok Oh
>            Priority: Minor
>             Fix For: 5.0 Beta6
>
>
> It is obvious from the code in DefaultHttpClientConnectionOperator that it is 
> supposed to throw ConnectTimeoutException in the case of connection timeout:
> {code:java}
> } catch (final ConnectException ex) {
>     if (last) {
>         final String msg = ex.getMessage();
>         throw "Connection timed out".equals(msg)
>                         ? new ConnectTimeoutException(ex, host, addresses)
>                         : new HttpHostConnectException(ex, host, addresses);
>     }
> {code}
> Recently, we've upgraded Apache HttpClient (indirectly through Google HTTP 
> Client), and our production code handling ConnectionException got broken due 
> to DefaultHttpClientConnectionOperator throwing HttpHostConnectException that 
> extends ConnectionException. (OTOH, ConnectTimeoutException is an IOException 
> and not a ConnectionException.)
> Java version:
> {code}
> openjdk version "1.8.0_222"
> OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1-b10)
> OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
> {code}
> Example code to reproduce:
> {code:java}
> public static void main(String[] args) throws IOException {
>    // example.com is reserved by the DNS standard and will always trigger 
> timeout
>    try (CloseableHttpClient client = HttpClients.createDefault();
>        CloseableHttpResponse response = client.execute(new 
> HttpGet("https://example.com:81";))) {}
> }
> {code}
> It currently throws the other exception HttpHostConnectException rather than 
> the supposed ConnectTimeoutException.
> {code}
> Exception in thread "main" org.apache.http.conn.HttpHostConnectException: 
> Connect to example.com:81 [example.com/93.184.216.34, 
> example.com/2606:2800:220:1:248:1893:25c8:1946] failed: Connection timed out 
> (Connection timed out)
>       at 
> org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:138)
>       at 
> org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:314)
>       at 
> org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:357)
>       at 
> org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:218)
>       at 
> org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:194)
>       at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:85)
>       at 
> org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
>       at 
> org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
>       at 
> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
>       at 
> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
>       at com.example.ApacheHttpClient2.main(ApacheHttpClient2.java:13)
> Caused by: java.net.ConnectException: Connection timed out (Connection timed 
> out)
>       at java.net.PlainSocketImpl.socketConnect(Native Method)
>       at 
> java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
>       at 
> java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
>       at 
> java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
>       at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
>       at java.net.Socket.connect(Socket.java:589)
>       at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:666)
>       at 
> org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:251)
>       at 
> org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:118)
>       ... 10 more
> {code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to