in httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java [190:260]
protected Future<AsyncClientEndpoint> doConnect(
final HttpHost host,
final Timeout timeout,
final Object attachment,
final FutureCallback<AsyncClientEndpoint> callback) {
Args.notNull(host, "Host");
Args.notNull(timeout, "Timeout");
final ComplexFuture<AsyncClientEndpoint> resultFuture = new ComplexFuture<>(callback);
final Future<PoolEntry<HttpHost, IOSession>> leaseFuture = connPool.lease(
host, null, timeout, new FutureCallback<PoolEntry<HttpHost, IOSession>>() {
@Override
public void completed(final PoolEntry<HttpHost, IOSession> poolEntry) {
final AsyncClientEndpoint endpoint = new InternalAsyncClientEndpoint(poolEntry);
final IOSession ioSession = poolEntry.getConnection();
if (ioSession != null && !ioSession.isOpen()) {
poolEntry.discardConnection(CloseMode.IMMEDIATE);
}
if (poolEntry.hasConnection()) {
resultFuture.completed(endpoint);
} else {
final Future<IOSession> future = requestSession(
host,
timeout,
new EndpointParameters(host, attachment),
new FutureCallback<IOSession>() {
@Override
public void completed(final IOSession session) {
session.setSocketTimeout(timeout);
poolEntry.assignConnection(session);
resultFuture.completed(endpoint);
}
@Override
public void failed(final Exception cause) {
try {
resultFuture.failed(cause);
} finally {
endpoint.releaseAndDiscard();
}
}
@Override
public void cancelled() {
try {
resultFuture.cancel();
} finally {
endpoint.releaseAndDiscard();
}
}
});
resultFuture.setDependency(future);
}
}
@Override
public void failed(final Exception ex) {
resultFuture.failed(ex);
}
@Override
public void cancelled() {
resultFuture.cancel();
}
});
resultFuture.setDependency(leaseFuture);
return resultFuture;
}