public void connect()

in httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java [116:204]


    public void connect(
            final ManagedHttpClientConnection conn,
            final HttpHost host,
            final InetSocketAddress localAddress,
            final Timeout connectTimeout,
            final SocketConfig socketConfig,
            final Object attachment,
            final HttpContext context) throws IOException {
        Args.notNull(conn, "Connection");
        Args.notNull(host, "Host");
        Args.notNull(socketConfig, "Socket config");
        Args.notNull(context, "Context");
        final Lookup<ConnectionSocketFactory> registry = getSocketFactoryRegistry(context);
        final ConnectionSocketFactory sf = registry.lookup(host.getSchemeName());
        if (sf == null) {
            throw new UnsupportedSchemeException(host.getSchemeName() + " protocol is not supported");
        }
        final InetAddress[] remoteAddresses;
        if (host.getAddress() != null) {
            remoteAddresses = new InetAddress[] { host.getAddress() };
        } else {
            if (LOG.isDebugEnabled()) {
                LOG.debug("{} resolving remote address", host.getHostName());
            }

            remoteAddresses = this.dnsResolver.resolve(host.getHostName());

            if (LOG.isDebugEnabled()) {
                LOG.debug("{} resolved to {}", host.getHostName(), Arrays.asList(remoteAddresses));
            }
        }

        final Timeout soTimeout = socketConfig.getSoTimeout();

        final int port = this.schemePortResolver.resolve(host);
        for (int i = 0; i < remoteAddresses.length; i++) {
            final InetAddress address = remoteAddresses[i];
            final boolean last = i == remoteAddresses.length - 1;

            Socket sock = sf.createSocket(context);
            if (soTimeout != null) {
                sock.setSoTimeout(soTimeout.toMillisecondsIntBound());
            }
            sock.setReuseAddress(socketConfig.isSoReuseAddress());
            sock.setTcpNoDelay(socketConfig.isTcpNoDelay());
            sock.setKeepAlive(socketConfig.isSoKeepAlive());
            if (socketConfig.getRcvBufSize() > 0) {
                sock.setReceiveBufferSize(socketConfig.getRcvBufSize());
            }
            if (socketConfig.getSndBufSize() > 0) {
                sock.setSendBufferSize(socketConfig.getSndBufSize());
            }

            final int linger = socketConfig.getSoLinger().toMillisecondsIntBound();
            if (linger >= 0) {
                sock.setSoLinger(true, linger);
            }
            conn.bind(sock);

            final InetSocketAddress remoteAddress = new InetSocketAddress(address, port);
            if (LOG.isDebugEnabled()) {
                LOG.debug("{}:{} connecting {}->{} ({})",
                        host.getHostName(), host.getPort(), localAddress, remoteAddress, connectTimeout);
            }
            try {
                sock = sf.connectSocket(sock, host, remoteAddress, localAddress, connectTimeout, attachment, context);
                conn.bind(sock);
                conn.setSocketTimeout(soTimeout);
                if (LOG.isDebugEnabled()) {
                    LOG.debug("{}:{} connected {}->{} as {}",
                            host.getHostName(), host.getPort(), localAddress, remoteAddress, ConnPoolSupport.getId(conn));
                }
                return;
            } catch (final IOException ex) {
                if (last) {
                    if (LOG.isDebugEnabled()) {
                        LOG.debug("{}:{} connection to {} failed ({}); terminating operation",
                                host.getHostName(), host.getPort(), remoteAddress, ex.getClass());
                    }
                    throw ConnectExceptionSupport.enhance(ex, host, remoteAddresses);
                } else {
                    if (LOG.isDebugEnabled()) {
                        LOG.debug("{}:{} connection to {} failed ({}); retrying connection to the next address",
                                host.getHostName(), host.getPort(), remoteAddress, ex.getClass());
                    }
                }
            }
        }
    }