protected void connect()

in rt/transports/http-hc5/src/main/java/org/apache/cxf/transport/http/asyncclient/hc5/AsyncHTTPConduit.java [480:621]


        protected void connect(boolean output) throws IOException {
            if (connectionFuture != null) {
                return;
            }
            
            final CXFResponseCallback delegate = new CXFResponseCallback() {
                @Override
                public void responseReceived(HttpResponse response) {
                    setHttpResponse(response);
                }

            };

            CXFResponseCallback responseCallback = delegate;
            if (asyncHttpResponseWrapperFactory != null) {
                final AsyncHttpResponseWrapper wrapper = asyncHttpResponseWrapperFactory.create();
                if (wrapper != null) {
                    responseCallback = new CXFResponseCallback() {
                        @Override
                        public void responseReceived(HttpResponse response) {
                            wrapper.responseReceived(response, delegate::responseReceived);
                        }
                    };
                }
            }


            FutureCallback<Boolean> callback = new FutureCallback<Boolean>() {

                public void completed(Boolean result) {
                }

                public void failed(Exception ex) {
                    setException(ex);
                    inbuf.shutdown();
                    outbuf.shutdown();
                }
                public void cancelled() {
                    handleCancelled();
                    inbuf.shutdown();
                    outbuf.shutdown();
                }

            };

            if (!output) {
                entity.removeHeaders("Transfer-Encoding");
                entity.removeHeaders("Content-Type");
                entity.setEntity(null);
            }

            HttpClientContext ctx = HttpClientContext.create();

            BasicCredentialsProvider credsProvider = new BasicCredentialsProvider() {
                @Override
                public Credentials getCredentials(final AuthScope authscope, HttpContext context) {
                    Credentials creds = super.getCredentials(authscope, context);
                    
                    if (creds != null) {
                        return creds;
                    }
                    if (AsyncHTTPConduit.this.proxyAuthorizationPolicy != null
                            && AsyncHTTPConduit.this.proxyAuthorizationPolicy.getUserName() != null) {
                        return new UsernamePasswordCredentials(
                                AsyncHTTPConduit.this.proxyAuthorizationPolicy.getUserName(),
                                AsyncHTTPConduit.this.proxyAuthorizationPolicy.getPassword().toCharArray());
                    }
                    return null;
                }

            };

            ctx.setCredentialsProvider(credsProvider);

            TlsStrategy tlsStrategy = null;
            if ("https".equals(url.getScheme())) {
                try {

                    // check tlsClientParameters from message header
                    TLSClientParameters tlsClientParameters = outMessage.get(TLSClientParameters.class);
                    if (tlsClientParameters == null) {
                        tlsClientParameters = getTlsClientParameters();
                    }
                    if (tlsClientParameters == null) {
                        tlsClientParameters = new TLSClientParameters();
                    }
                    final SSLContext sslcontext = getSSLContext(tlsClientParameters);
                    final HostnameVerifier verifier = org.apache.cxf.transport.https.SSLUtils
                        .getHostnameVerifier(tlsClientParameters);
     
                    String[] cipherSuites =
                        SSLUtils.getCiphersuitesToInclude(tlsClientParameters.getCipherSuites(),
                                                          tlsClientParameters.getCipherSuitesFilter(),
                                                          sslcontext.getSocketFactory().getDefaultCipherSuites(),
                                                          SSLUtils.getSupportedCipherSuites(sslcontext),
                                                          LOG);
                    
                    final String protocol = tlsClientParameters.getSecureSocketProtocol() != null ? tlsClientParameters
                        .getSecureSocketProtocol() : sslcontext.getProtocol();

                    final String[] protocols = findProtocols(protocol,
                        sslContext.getSupportedSSLParameters().getProtocols());

                    tlsStrategy = new DefaultClientTlsStrategy(sslcontext, protocols,
                        cipherSuites, SSLBufferMode.STATIC, verifier);
                } catch (final GeneralSecurityException e) {
                    LOG.warning(e.getMessage());
                }
            }

            if (sslURL != null && isSslTargetDifferent(sslURL, url)) {
                sslURL = null;
                sslState = null;
                session = null;
            }
            
            if (tlsClientParameters != null && tlsClientParameters.hashCode() == lastTlsHash) {
                ctx.setUserToken(sslState);
            }

            connectionFuture = new BasicFuture<>(callback);
            // The HttpClientContext is not available in the AsyncClientConnectionOperator, so we have
            // to provide our own TLS strategy on construction.
            final HttpAsyncClient c = getHttpAsyncClient(tlsStrategy);
            final Credentials creds = (Credentials)outMessage.getContextualProperty(Credentials.class.getName());
            if (creds != null) {
                credsProvider.setCredentials(new AuthScope(url.getHost(), url.getPort()), creds);
                ctx.setUserToken(creds.getUserPrincipal());
            }
            @SuppressWarnings("unchecked")
            Registry<AuthSchemeFactory> asp = (Registry<AuthSchemeFactory>)outMessage
                .getContextualProperty(AuthSchemeFactory.class.getName());
            if (asp != null) {
                ctx.setAuthSchemeRegistry(asp);
            }

            c.execute(new CXFHttpAsyncRequestProducer(entity, outbuf),
                      new CXFHttpAsyncResponseConsumer(this, inbuf, responseCallback),
                      null, /* the push handler factory, optional and may be null */
                      ctx,
                      callback);
        }