Args.notNull(params, "HTTP parameters");
Asserts.check(!conn.isOpen(), "Connection must not be open");
final SchemeRegistry registry = getSchemeRegistry(context);
final Scheme schm = registry.getScheme(target.getSchemeName());
final SchemeSocketFactory sf = schm.getSchemeSocketFactory();
final InetAddress[] addresses = resolveHostname(target.getHostName());
final int port = schm.resolvePort(target.getPort());
for (int i = 0; i < addresses.length; i++) {
final InetAddress address = addresses[i];
final boolean last = i == addresses.length - 1;
Socket sock = sf.createSocket(params);
conn.opening(sock, target);
final InetSocketAddress remoteAddress = new HttpInetSocketAddress(target, address, port);
InetSocketAddress localAddress = null;
if (local != null) {
localAddress = new InetSocketAddress(local, 0);
}
if (this.log.isDebugEnabled()) {
this.log.debug("Connecting to " + remoteAddress);
}
try {
final Socket connsock = sf.connectSocket(sock, remoteAddress, localAddress, params);
if (sock != connsock) {
sock = connsock;
conn.opening(sock, target);
}
prepareSocket(sock, context, params);
conn.openCompleted(sf.isSecure(sock), params);
return;
} catch (final ConnectException ex) {
if (last) {
throw new HttpHostConnectException(target, ex);
}