new connection interfaces, step 3 - HTTPCLIENT-475
git-svn-id: https://svn.apache.org/repos/asf/jakarta/httpcomponents/httpclient/trunk@492424 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ceb4ed1d39
commit
4fe52a15b9
|
@ -88,6 +88,37 @@ public interface UnmanagedClientConnection
|
||||||
// do not require connections to store parameters.
|
// do not require connections to store parameters.
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepares opening this connection.
|
||||||
|
* Opening can be prepared only while the connection is closed.
|
||||||
|
* This is an optional step, you can call {@link #open open}
|
||||||
|
* without preparing.
|
||||||
|
* <br/>
|
||||||
|
* By calling this method, you provide the connection with
|
||||||
|
* the unconnected socket that will be connected in order
|
||||||
|
* to call {@link #open open}. This allows the connection to
|
||||||
|
* close that socket if
|
||||||
|
* {@link org.apache.http.HttpConnection#shutdown shutdown}
|
||||||
|
* is called before it is open. Closing the unconnected socket
|
||||||
|
* will interrupt a thread that is blocked on the connect.
|
||||||
|
* Otherwise, that thread will either time out on the connect,
|
||||||
|
* or it returns successfully and then opens this connection
|
||||||
|
* which was just shut down.
|
||||||
|
* <br/>
|
||||||
|
* <b>Note:</b>
|
||||||
|
* The result of {@link #getSocket getSocket} is defined
|
||||||
|
* only for open connections. You MUST NOT rely on that
|
||||||
|
* method to return the unconnected socket after preparing.
|
||||||
|
*
|
||||||
|
* @param sock the unconnected socket which is about to
|
||||||
|
* be connected in order to call {@link #open open}.
|
||||||
|
* <code>null</code> can be passed to undo a
|
||||||
|
* previous call.
|
||||||
|
*/
|
||||||
|
void prepare(Socket sock)
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens this connection.
|
* Opens this connection.
|
||||||
* A connection can be openend only while it is closed.
|
* A connection can be openend only while it is closed.
|
||||||
|
|
|
@ -55,6 +55,9 @@ import org.apache.http.conn.UnmanagedClientConnection;
|
||||||
public class DefaultClientConnection extends SocketHttpClientConnection
|
public class DefaultClientConnection extends SocketHttpClientConnection
|
||||||
implements UnmanagedClientConnection {
|
implements UnmanagedClientConnection {
|
||||||
|
|
||||||
|
/** The unconnected socket while being prepared. */
|
||||||
|
private volatile Socket preparedSocket;
|
||||||
|
|
||||||
/** The target host of this connection. */
|
/** The target host of this connection. */
|
||||||
private HttpHost targetHost;
|
private HttpHost targetHost;
|
||||||
|
|
||||||
|
@ -84,6 +87,35 @@ public class DefaultClientConnection extends SocketHttpClientConnection
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// non-javadoc, see interface UnmanagedClientConnection
|
||||||
|
public void prepare(Socket sock) {
|
||||||
|
|
||||||
|
assertNotOpen();
|
||||||
|
preparedSocket = sock;
|
||||||
|
|
||||||
|
} // prepare
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Force-closes this connection.
|
||||||
|
* If it is not yet {@link #open open} but {@link #prepare prepared},
|
||||||
|
* the associated socket is closed. That will interrupt a thread that
|
||||||
|
* is blocked on connecting the socket.
|
||||||
|
*
|
||||||
|
* @throws IOException in case of a problem
|
||||||
|
*/
|
||||||
|
public void shutdown()
|
||||||
|
throws IOException {
|
||||||
|
|
||||||
|
Socket sock = preparedSocket; // copy volatile attribute
|
||||||
|
if (sock != null)
|
||||||
|
sock.close();
|
||||||
|
|
||||||
|
super.shutdown();
|
||||||
|
|
||||||
|
} // shutdown
|
||||||
|
|
||||||
|
|
||||||
// non-javadoc, see interface UnmanagedClientConnection
|
// non-javadoc, see interface UnmanagedClientConnection
|
||||||
public void open(Socket sock, HttpHost target,
|
public void open(Socket sock, HttpHost target,
|
||||||
boolean secure, HttpParams params)
|
boolean secure, HttpParams params)
|
||||||
|
@ -107,6 +139,8 @@ public class DefaultClientConnection extends SocketHttpClientConnection
|
||||||
targetHost = target;
|
targetHost = target;
|
||||||
connSecure = secure;
|
connSecure = secure;
|
||||||
|
|
||||||
|
preparedSocket = null;
|
||||||
|
|
||||||
} // open
|
} // open
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -104,18 +104,20 @@ public class DefaultSocketConnectionOperator
|
||||||
"' in target host.");
|
"' in target host.");
|
||||||
}
|
}
|
||||||
final SocketFactory sf = schm.getSocketFactory();
|
final SocketFactory sf = schm.getSocketFactory();
|
||||||
//@@@ create socket, register in connection, connect? (HTTPCLIENT-475)
|
|
||||||
//@@@ Requires registration method, since conn.open(...) fails if
|
Socket sock = sf.createSocket();
|
||||||
//@@@ the socket is not open. Dependent objects need the streams!
|
conn.prepare(sock);
|
||||||
final Socket sock = sf.connectSocket
|
|
||||||
(null, target.getHostName(), target.getPort(), local, 0, params);
|
sock = sf.connectSocket
|
||||||
|
(sock, target.getHostName(), target.getPort(), local, 0, params);
|
||||||
prepareSocket(sock, context, params);
|
prepareSocket(sock, context, params);
|
||||||
|
|
||||||
//@@@ ask the factory whether the new socket is secure?
|
//@@@ ask the factory whether the new socket is secure?
|
||||||
boolean secure = (sf instanceof SecureSocketFactory);
|
boolean secure = (sf instanceof SecureSocketFactory);
|
||||||
|
|
||||||
conn.open(sock, target, secure, params);
|
conn.open(sock, target, secure, params);
|
||||||
//@@@ error handling: close the created socket in case of exception?
|
//@@@ error handling: unprepare the connection?
|
||||||
|
//@@@ error handling: close the created socket?
|
||||||
|
|
||||||
} // openConnection
|
} // openConnection
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue