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

Chanseok Oh commented on HTTPCLIENT-2013:
-----------------------------------------

Filed a bug against Oracle JDK a while ago. Just got a message today that 
they've finished internal review on it, and the bug has been posted today: 
[https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8230528]

Their first comment is what I actually anticipated, since it's obvious 
{{SocketTimeoutException}} is when by the socket {{SO_TIMEOUT,}} while the 
{{ConnectException}} timeout case is when the handshake fails at a lower level 
unrelated to {{SO_TIMEOUT}}. In any case, the situation is confusing enough IMO 
and it doesn't provide a reliable way to programmatically determine whether a 
timeout happened, so I'll just hope they are willing to mitigate this somehow. 
Their priority is P4 though.

> 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
>
> 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