in httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttpAsyncClient.java [130:203]
private Future<AsyncConnectionEndpoint> leaseEndpoint(
final HttpHost host,
final Timeout connectionRequestTimeout,
final Timeout connectTimeout,
final HttpClientContext clientContext,
final FutureCallback<AsyncConnectionEndpoint> callback) {
final HttpRoute route = new HttpRoute(RoutingSupport.normalize(host, schemePortResolver));
final ComplexFuture<AsyncConnectionEndpoint> resultFuture = new ComplexFuture<>(callback);
final String exchangeId = ExecSupport.getNextExchangeId();
clientContext.setExchangeId(exchangeId);
final Future<AsyncConnectionEndpoint> leaseFuture = manager.lease(
exchangeId,
route,
null,
connectionRequestTimeout,
new FutureCallback<AsyncConnectionEndpoint>() {
@Override
public void completed(final AsyncConnectionEndpoint connectionEndpoint) {
if (connectionEndpoint.isConnected()) {
resultFuture.completed(connectionEndpoint);
} else {
final Future<AsyncConnectionEndpoint> connectFuture = manager.connect(
connectionEndpoint,
getConnectionInitiator(),
connectTimeout,
tlsConfig,
clientContext,
new FutureCallback<AsyncConnectionEndpoint>() {
@Override
public void completed(final AsyncConnectionEndpoint result) {
resultFuture.completed(result);
}
@Override
public void failed(final Exception ex) {
try {
Closer.closeQuietly(connectionEndpoint);
manager.release(connectionEndpoint, null, TimeValue.ZERO_MILLISECONDS);
} finally {
resultFuture.failed(ex);
}
}
@Override
public void cancelled() {
try {
Closer.closeQuietly(connectionEndpoint);
manager.release(connectionEndpoint, null, TimeValue.ZERO_MILLISECONDS);
} finally {
resultFuture.cancel(true);
}
}
});
resultFuture.setDependency(connectFuture);
}
}
@Override
public void failed(final Exception ex) {
callback.failed(ex);
}
@Override
public void cancelled() {
callback.cancelled();
}
});
resultFuture.setDependency(leaseFuture);
return resultFuture;
}