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

Glyn Davies commented on HTTPCLIENT-875:
----------------------------------------



When DefaultMultihomePlainSocketFactory receives an IOException on connect, it 

1. Creates a new socket
2. Attempts to connect to the next IP address that exists for that DNS hostname

So, in a situation where the first IP address returned in the DNS fails to 
connect (connection refused, say) the DefaultMultihomePlainSocketFactory will 
create a new socket, and attempt to connect to the server with this new socket.

This new socket is returned from the connectSocket() method call, and is 
intended to replace the existing socket - which is a dead / failed connection.

4.0 of httpclient doesn't update this socket, and ignores the returned socket.

The '4.1' declared fix fails for me, because of the assertOpen() - as the 
initial socket is dead.



> DefaultClientConnectionOperator doesn't update socket after call to 
> connectSocket(...)
> --------------------------------------------------------------------------------------
>
>                 Key: HTTPCLIENT-875
>                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-875
>             Project: HttpComponents HttpClient
>          Issue Type: Bug
>          Components: HttpClient
>    Affects Versions: 4.0 Beta 2, 4.0 Final
>            Reporter: Connell Gauld
>             Fix For: 4.1 Alpha1
>
>         Attachments: HTTPCLIENT-875-2.patch, HTTPCLIENT-875.diff
>
>
> In the DefaultClientConnectionOperator function openConnection(...) it calls 
> SocketFactory.connectSocket(...). The documentation for connectSocket(...) 
> says that it returns:
>    "the connected socket. The returned object may be different from
> the sock argument if this factory supports a layered protocol. "
> A quick peek at the source showed:
> In org.apache.http.impl.conn.DefaultClientConnectionOperator:
> 117         final SocketFactory sf = schm.getSocketFactory();
> 118
> 119         Socket sock = sf.createSocket();
> 120         conn.opening(sock, target);
> 121
> 122         try {
> 123             sock = sf.connectSocket(sock, target.getHostName(),
> 124                     schm.resolvePort(target.getPort()),
> 125                     local, 0, params);
> 126         } catch (ConnectException ex) {
> 127             throw new HttpHostConnectException(target, ex);
> 128         }
> 129         prepareSocket(sock, context, params);
> 130         conn.openCompleted(sf.isSecure(sock), params);
> So DefaultClientConnectionOperator never updates conn with the new version of 
> sock that may have been returned from connectSocket(...).
> adding:
>         130         conn.openCompleted(sf.isSecure(sock), params);
> +++ 131         conn.update(sock, target, sf.isSecure(sock), params);
> appears to fix the issue.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to