Java tutorial
/* * ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.http.impl.nio.client; import java.net.ProxySelector; import java.util.Collection; import java.util.LinkedList; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import org.apache.http.ConnectionReuseStrategy; import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.http.HttpRequestInterceptor; import org.apache.http.HttpResponseInterceptor; import org.apache.http.annotation.NotThreadSafe; import org.apache.http.auth.AuthSchemeProvider; import org.apache.http.client.AuthenticationStrategy; import org.apache.http.client.CookieStore; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.RedirectStrategy; import org.apache.http.client.UserTokenHandler; import org.apache.http.client.config.AuthSchemes; import org.apache.http.client.config.CookieSpecs; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.protocol.RequestAddCookies; import org.apache.http.client.protocol.RequestAuthCache; import org.apache.http.client.protocol.RequestClientConnControl; import org.apache.http.client.protocol.RequestDefaultHeaders; import org.apache.http.client.protocol.RequestExpectContinue; import org.apache.http.client.protocol.ResponseProcessCookies; import org.apache.http.config.ConnectionConfig; import org.apache.http.config.Lookup; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.ConnectionKeepAliveStrategy; import org.apache.http.conn.DnsResolver; import org.apache.http.conn.SchemePortResolver; import org.apache.http.conn.routing.HttpRoutePlanner; import org.apache.http.conn.ssl.DefaultHostnameVerifier; import org.apache.http.conn.ssl.X509HostnameVerifier; import org.apache.http.conn.util.PublicSuffixMatcher; import org.apache.http.conn.util.PublicSuffixMatcherLoader; import org.apache.http.cookie.CookieSpecProvider; import org.apache.http.impl.DefaultConnectionReuseStrategy; import org.apache.http.impl.NoConnectionReuseStrategy; import org.apache.http.impl.auth.BasicSchemeFactory; import org.apache.http.impl.auth.DigestSchemeFactory; import org.apache.http.impl.auth.KerberosSchemeFactory; import org.apache.http.impl.auth.NTLMSchemeFactory; import org.apache.http.impl.auth.SPNegoSchemeFactory; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy; import org.apache.http.impl.client.DefaultRedirectStrategy; import org.apache.http.impl.client.NoopUserTokenHandler; import org.apache.http.impl.client.ProxyAuthenticationStrategy; import org.apache.http.impl.client.TargetAuthenticationStrategy; import org.apache.http.impl.conn.DefaultProxyRoutePlanner; import org.apache.http.impl.conn.DefaultRoutePlanner; import org.apache.http.impl.conn.DefaultSchemePortResolver; import org.apache.http.impl.conn.SystemDefaultRoutePlanner; import org.apache.http.impl.cookie.DefaultCookieSpecProvider; import org.apache.http.impl.cookie.IgnoreSpecProvider; import org.apache.http.impl.cookie.NetscapeDraftSpecProvider; import org.apache.http.impl.cookie.RFC6265CookieSpecProvider; import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager; import org.apache.http.impl.nio.reactor.IOReactorConfig; import org.apache.http.nio.NHttpClientEventHandler; import org.apache.http.nio.conn.NHttpClientConnectionManager; import org.apache.http.nio.conn.NoopIOSessionStrategy; import org.apache.http.nio.conn.SchemeIOSessionStrategy; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.apache.http.nio.protocol.HttpAsyncRequestExecutor; import org.apache.http.nio.reactor.ConnectingIOReactor; import org.apache.http.protocol.HttpProcessor; import org.apache.http.protocol.HttpProcessorBuilder; import org.apache.http.protocol.RequestContent; import org.apache.http.protocol.RequestTargetHost; import org.apache.http.protocol.RequestUserAgent; import org.apache.http.ssl.SSLContexts; import org.apache.http.util.TextUtils; import org.apache.http.util.VersionInfo; /** * Builder for {@link CloseableHttpAsyncClient} instances. * <p> * When a particular component is not explicitly this class will * use its default implementation. System properties will be taken * into account when configuring the default implementations when * {@link #useSystemProperties()} method is called prior to calling * {@link #build()}. * <ul> * <li>ssl.TrustManagerFactory.algorithm</li> * <li>javax.net.ssl.trustStoreType</li> * <li>javax.net.ssl.trustStore</li> * <li>javax.net.ssl.trustStoreProvider</li> * <li>javax.net.ssl.trustStorePassword</li> * <li>ssl.KeyManagerFactory.algorithm</li> * <li>javax.net.ssl.keyStoreType</li> * <li>javax.net.ssl.keyStore</li> * <li>javax.net.ssl.keyStoreProvider</li> * <li>javax.net.ssl.keyStorePassword</li> * <li>https.protocols</li> * <li>https.cipherSuites</li> * <li>http.proxyHost</li> * <li>http.proxyPort</li> * <li>http.keepAlive</li> * <li>http.maxConnections</li> * <li>http.agent</li> * </ul> * <p> * Please note that some settings used by this class can be mutually * exclusive and may not apply when building {@link CloseableHttpAsyncClient} * instances. * * @since 4.0 */ @NotThreadSafe public class HttpAsyncClientBuilder { private NHttpClientConnectionManager connManager; private boolean connManagerShared; private SchemePortResolver schemePortResolver; private SchemeIOSessionStrategy sslStrategy; private HostnameVerifier hostnameVerifier; private SSLContext sslcontext; private ConnectionReuseStrategy reuseStrategy; private ConnectionKeepAliveStrategy keepAliveStrategy; private AuthenticationStrategy targetAuthStrategy; private AuthenticationStrategy proxyAuthStrategy; private UserTokenHandler userTokenHandler; private HttpProcessor httpprocessor; private DnsResolver dnsResolver; private LinkedList<HttpRequestInterceptor> requestFirst; private LinkedList<HttpRequestInterceptor> requestLast; private LinkedList<HttpResponseInterceptor> responseFirst; private LinkedList<HttpResponseInterceptor> responseLast; private HttpRoutePlanner routePlanner; private RedirectStrategy redirectStrategy; private Lookup<AuthSchemeProvider> authSchemeRegistry; private Lookup<CookieSpecProvider> cookieSpecRegistry; private CookieStore cookieStore; private CredentialsProvider credentialsProvider; private String userAgent; private HttpHost proxy; private Collection<? extends Header> defaultHeaders; private IOReactorConfig defaultIOReactorConfig; private ConnectionConfig defaultConnectionConfig; private RequestConfig defaultRequestConfig; private ThreadFactory threadFactory; private NHttpClientEventHandler eventHandler; private PublicSuffixMatcher publicSuffixMatcher; private boolean systemProperties; private boolean cookieManagementDisabled; private boolean authCachingDisabled; private boolean connectionStateDisabled; private int maxConnTotal = 0; private int maxConnPerRoute = 0; public static HttpAsyncClientBuilder create() { return new HttpAsyncClientBuilder(); } protected HttpAsyncClientBuilder() { super(); } /** * Assigns file containing public suffix matcher. Instances of this class can be created * with {@link org.apache.http.conn.util.PublicSuffixMatcherLoader}. * * @see org.apache.http.conn.util.PublicSuffixMatcher * @see org.apache.http.conn.util.PublicSuffixMatcherLoader * * @since 4.1 */ public final HttpAsyncClientBuilder setPublicSuffixMatcher(final PublicSuffixMatcher publicSuffixMatcher) { this.publicSuffixMatcher = publicSuffixMatcher; return this; } /** * Assigns {@link NHttpClientConnectionManager} instance. */ public final HttpAsyncClientBuilder setConnectionManager(final NHttpClientConnectionManager connManager) { this.connManager = connManager; return this; } /** * Defines the connection manager is to be shared by multiple * client instances. * <p> * If the connection manager is shared its life-cycle is expected * to be managed by the caller and it will not be shut down * if the client is closed. * * @param shared defines whether or not the connection manager can be shared * by multiple clients. * * @since 4.1 */ public final HttpAsyncClientBuilder setConnectionManagerShared(final boolean shared) { this.connManagerShared = shared; return this; } /** * Assigns {@link SchemePortResolver} instance. */ public final HttpAsyncClientBuilder setSchemePortResolver(final SchemePortResolver schemePortResolver) { this.schemePortResolver = schemePortResolver; return this; } /** * Assigns maximum total connection value. * <p> * Please note this value can be overridden by the {@link #setConnectionManager( * org.apache.http.nio.conn.NHttpClientConnectionManager)} method. */ public final HttpAsyncClientBuilder setMaxConnTotal(final int maxConnTotal) { this.maxConnTotal = maxConnTotal; return this; } /** * Assigns maximum connection per route value. * <p> * Please note this value can be overridden by the {@link #setConnectionManager( * org.apache.http.nio.conn.NHttpClientConnectionManager)} method. */ public final HttpAsyncClientBuilder setMaxConnPerRoute(final int maxConnPerRoute) { this.maxConnPerRoute = maxConnPerRoute; return this; } /** * Assigns {@link ConnectionReuseStrategy} instance. */ public final HttpAsyncClientBuilder setConnectionReuseStrategy(final ConnectionReuseStrategy reuseStrategy) { this.reuseStrategy = reuseStrategy; return this; } /** * Assigns {@link ConnectionKeepAliveStrategy} instance. */ public final HttpAsyncClientBuilder setKeepAliveStrategy(final ConnectionKeepAliveStrategy keepAliveStrategy) { this.keepAliveStrategy = keepAliveStrategy; return this; } /** * Assigns {@link UserTokenHandler} instance. * <p> * Please note this value can be overridden by the {@link #disableConnectionState()} * method. */ public final HttpAsyncClientBuilder setUserTokenHandler(final UserTokenHandler userTokenHandler) { this.userTokenHandler = userTokenHandler; return this; } /** * Assigns {@link AuthenticationStrategy} instance for proxy * authentication. */ public final HttpAsyncClientBuilder setTargetAuthenticationStrategy( final AuthenticationStrategy targetAuthStrategy) { this.targetAuthStrategy = targetAuthStrategy; return this; } /** * Assigns {@link AuthenticationStrategy} instance for target * host authentication. */ public final HttpAsyncClientBuilder setProxyAuthenticationStrategy( final AuthenticationStrategy proxyAuthStrategy) { this.proxyAuthStrategy = proxyAuthStrategy; return this; } /** * Assigns {@link HttpProcessor} instance. */ public final HttpAsyncClientBuilder setHttpProcessor(final HttpProcessor httpprocessor) { this.httpprocessor = httpprocessor; return this; } /** * Assigns {@link DnsResolver} instance. * <p> * Please note this value can be overridden by the {@link #setConnectionManager( * org.apache.http.nio.conn.NHttpClientConnectionManager)} method. */ public final HttpAsyncClientBuilder setDnsResolver(final DnsResolver dnsResolver) { this.dnsResolver = dnsResolver; return this; } /** * Adds this protocol interceptor to the head of the protocol processing list. * <p> * Please note this value can be overridden by the {@link #setHttpProcessor( * org.apache.http.protocol.HttpProcessor)} method. */ public final HttpAsyncClientBuilder addInterceptorFirst(final HttpResponseInterceptor itcp) { if (itcp == null) { return this; } if (responseFirst == null) { responseFirst = new LinkedList<HttpResponseInterceptor>(); } responseFirst.addFirst(itcp); return this; } /** * Adds this protocol interceptor to the tail of the protocol processing list. * <p> * Please note this value can be overridden by the {@link #setHttpProcessor( * org.apache.http.protocol.HttpProcessor)} method. */ public final HttpAsyncClientBuilder addInterceptorLast(final HttpResponseInterceptor itcp) { if (itcp == null) { return this; } if (responseLast == null) { responseLast = new LinkedList<HttpResponseInterceptor>(); } responseLast.addLast(itcp); return this; } /** * Adds this protocol interceptor to the head of the protocol processing list. * <p> * Please note this value can be overridden by the {@link #setHttpProcessor( * org.apache.http.protocol.HttpProcessor)} method. */ public final HttpAsyncClientBuilder addInterceptorFirst(final HttpRequestInterceptor itcp) { if (itcp == null) { return this; } if (requestFirst == null) { requestFirst = new LinkedList<HttpRequestInterceptor>(); } requestFirst.addFirst(itcp); return this; } /** * Adds this protocol interceptor to the tail of the protocol processing list. * <p> * Please note this value can be overridden by the {@link #setHttpProcessor( * org.apache.http.protocol.HttpProcessor)} method. */ public final HttpAsyncClientBuilder addInterceptorLast(final HttpRequestInterceptor itcp) { if (itcp == null) { return this; } if (requestLast == null) { requestLast = new LinkedList<HttpRequestInterceptor>(); } requestLast.addLast(itcp); return this; } /** * Assigns {@link HttpRoutePlanner} instance. */ public final HttpAsyncClientBuilder setRoutePlanner(final HttpRoutePlanner routePlanner) { this.routePlanner = routePlanner; return this; } /** * Assigns {@link RedirectStrategy} instance. */ public final HttpAsyncClientBuilder setRedirectStrategy(final RedirectStrategy redirectStrategy) { this.redirectStrategy = redirectStrategy; return this; } /** * Assigns default {@link CookieStore} instance which will be used for * request execution if not explicitly set in the client execution context. */ public final HttpAsyncClientBuilder setDefaultCookieStore(final CookieStore cookieStore) { this.cookieStore = cookieStore; return this; } /** * Assigns default {@link CredentialsProvider} instance which will be used * for request execution if not explicitly set in the client execution * context. */ public final HttpAsyncClientBuilder setDefaultCredentialsProvider( final CredentialsProvider credentialsProvider) { this.credentialsProvider = credentialsProvider; return this; } /** * Assigns default {@link org.apache.http.auth.AuthScheme} registry which will * be used for request execution if not explicitly set in the client execution * context. */ public final HttpAsyncClientBuilder setDefaultAuthSchemeRegistry( final Lookup<AuthSchemeProvider> authSchemeRegistry) { this.authSchemeRegistry = authSchemeRegistry; return this; } /** * Assigns default {@link org.apache.http.cookie.CookieSpec} registry which will * be used for request execution if not explicitly set in the client execution * context. */ public final HttpAsyncClientBuilder setDefaultCookieSpecRegistry( final Lookup<CookieSpecProvider> cookieSpecRegistry) { this.cookieSpecRegistry = cookieSpecRegistry; return this; } /** * Assigns {@code User-Agent} value. * <p> * Please note this value can be overridden by the {@link #setHttpProcessor( * org.apache.http.protocol.HttpProcessor)} method. */ public final HttpAsyncClientBuilder setUserAgent(final String userAgent) { this.userAgent = userAgent; return this; } /** * Assigns default proxy value. * <p> * Please note this value can be overridden by the {@link #setRoutePlanner( * org.apache.http.conn.routing.HttpRoutePlanner)} method. */ public final HttpAsyncClientBuilder setProxy(final HttpHost proxy) { this.proxy = proxy; return this; } /** * Assigns {@link SchemeIOSessionStrategy} instance. * <p> * Please note this value can be overridden by the {@link #setConnectionManager( * org.apache.http.nio.conn.NHttpClientConnectionManager)} method. */ public final HttpAsyncClientBuilder setSSLStrategy(final SchemeIOSessionStrategy strategy) { this.sslStrategy = strategy; return this; } /** * Assigns {@link SSLContext} instance. * <p> * Please note this value can be overridden by the {@link #setConnectionManager( * org.apache.http.nio.conn.NHttpClientConnectionManager)} and the {@link #setSSLStrategy( * org.apache.http.nio.conn.SchemeIOSessionStrategy)} methods. */ public final HttpAsyncClientBuilder setSSLContext(final SSLContext sslcontext) { this.sslcontext = sslcontext; return this; } /** * Assigns {@link X509HostnameVerifier} instance. * <p> * Please note this value can be overridden by the {@link #setConnectionManager( * org.apache.http.nio.conn.NHttpClientConnectionManager)} and the {@link #setSSLStrategy( * org.apache.http.nio.conn.SchemeIOSessionStrategy)} methods. * * @deprecated (4.1) use {@link #setSSLHostnameVerifier(javax.net.ssl.HostnameVerifier)} */ @Deprecated public final HttpAsyncClientBuilder setHostnameVerifier(final X509HostnameVerifier hostnameVerifier) { this.hostnameVerifier = hostnameVerifier; return this; } /** * Assigns {@link javax.net.ssl.HostnameVerifier} instance. * <p> * Please note this value can be overridden by the {@link #setConnectionManager( * org.apache.http.nio.conn.NHttpClientConnectionManager)} and the {@link #setSSLStrategy( * org.apache.http.nio.conn.SchemeIOSessionStrategy)} methods. * * @since 4.1 */ public final HttpAsyncClientBuilder setSSLHostnameVerifier(final HostnameVerifier hostnameVerifier) { this.hostnameVerifier = hostnameVerifier; return this; } /** * Assigns default request header values. * <p> * Please note this value can be overridden by the {@link #setHttpProcessor( * org.apache.http.protocol.HttpProcessor)} method. */ public final HttpAsyncClientBuilder setDefaultHeaders(final Collection<? extends Header> defaultHeaders) { this.defaultHeaders = defaultHeaders; return this; } /** * Assigns default {@link IOReactorConfig}. * <p> * Please note this value can be overridden by the {@link #setConnectionManager( * org.apache.http.nio.conn.NHttpClientConnectionManager)} method. */ public final HttpAsyncClientBuilder setDefaultIOReactorConfig(final IOReactorConfig config) { this.defaultIOReactorConfig = config; return this; } /** * Assigns default {@link ConnectionConfig}. * <p> * Please note this value can be overridden by the {@link #setConnectionManager( * org.apache.http.nio.conn.NHttpClientConnectionManager)} method. */ public final HttpAsyncClientBuilder setDefaultConnectionConfig(final ConnectionConfig config) { this.defaultConnectionConfig = config; return this; } /** * Assigns default {@link RequestConfig} instance which will be used * for request execution if not explicitly set in the client execution * context. */ public final HttpAsyncClientBuilder setDefaultRequestConfig(final RequestConfig config) { this.defaultRequestConfig = config; return this; } /** * Assigns {@link ThreadFactory} instance. */ public final HttpAsyncClientBuilder setThreadFactory(final ThreadFactory threadFactory) { this.threadFactory = threadFactory; return this; } /** * Assigns {@link NHttpClientEventHandler} instance. * * @since 4.1 */ public final HttpAsyncClientBuilder setEventHandler(final NHttpClientEventHandler eventHandler) { this.eventHandler = eventHandler; return this; } /** * Disables connection state tracking. */ public final HttpAsyncClientBuilder disableConnectionState() { connectionStateDisabled = true; return this; } /** * Disables state (cookie) management. * <p> * Please note this value can be overridden by the {@link #setHttpProcessor( * org.apache.http.protocol.HttpProcessor)} method. */ public final HttpAsyncClientBuilder disableCookieManagement() { cookieManagementDisabled = true; return this; } /** * Disables authentication scheme caching. * <p> * Please note this value can be overridden by the {@link #setHttpProcessor( * org.apache.http.protocol.HttpProcessor)} method. */ public final HttpAsyncClientBuilder disableAuthCaching() { authCachingDisabled = true; return this; } /** * Use system properties when creating and configuring default * implementations. */ public final HttpAsyncClientBuilder useSystemProperties() { systemProperties = true; return this; } private static String[] split(final String s) { if (TextUtils.isBlank(s)) { return null; } return s.split(" *, *"); } public CloseableHttpAsyncClient build() { PublicSuffixMatcher publicSuffixMatcher = this.publicSuffixMatcher; if (publicSuffixMatcher == null) { publicSuffixMatcher = PublicSuffixMatcherLoader.getDefault(); } NHttpClientConnectionManager connManager = this.connManager; if (connManager == null) { SchemeIOSessionStrategy sslStrategy = this.sslStrategy; if (sslStrategy == null) { SSLContext sslcontext = this.sslcontext; if (sslcontext == null) { if (systemProperties) { sslcontext = SSLContexts.createSystemDefault(); } else { sslcontext = SSLContexts.createDefault(); } } final String[] supportedProtocols = systemProperties ? split(System.getProperty("https.protocols")) : null; final String[] supportedCipherSuites = systemProperties ? split(System.getProperty("https.cipherSuites")) : null; HostnameVerifier hostnameVerifier = this.hostnameVerifier; if (hostnameVerifier == null) { hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher); } sslStrategy = new SSLIOSessionStrategy(sslcontext, supportedProtocols, supportedCipherSuites, hostnameVerifier); } final ConnectingIOReactor ioreactor = IOReactorUtils .create(defaultIOReactorConfig != null ? defaultIOReactorConfig : IOReactorConfig.DEFAULT); final PoolingNHttpClientConnectionManager poolingmgr = new PoolingNHttpClientConnectionManager( ioreactor, null, RegistryBuilder.<SchemeIOSessionStrategy>create() .register("http", NoopIOSessionStrategy.INSTANCE).register("https", sslStrategy) .build(), this.dnsResolver); if (defaultConnectionConfig != null) { poolingmgr.setDefaultConnectionConfig(defaultConnectionConfig); } if (systemProperties) { String s = System.getProperty("http.keepAlive", "true"); if ("true".equalsIgnoreCase(s)) { s = System.getProperty("http.maxConnections", "5"); final int max = Integer.parseInt(s); poolingmgr.setDefaultMaxPerRoute(max); poolingmgr.setMaxTotal(2 * max); } } else { if (maxConnTotal > 0) { poolingmgr.setMaxTotal(maxConnTotal); } if (maxConnPerRoute > 0) { poolingmgr.setDefaultMaxPerRoute(maxConnPerRoute); } } connManager = poolingmgr; } ConnectionReuseStrategy reuseStrategy = this.reuseStrategy; if (reuseStrategy == null) { if (systemProperties) { final String s = System.getProperty("http.keepAlive", "true"); if ("true".equalsIgnoreCase(s)) { reuseStrategy = DefaultConnectionReuseStrategy.INSTANCE; } else { reuseStrategy = NoConnectionReuseStrategy.INSTANCE; } } else { reuseStrategy = DefaultConnectionReuseStrategy.INSTANCE; } } ConnectionKeepAliveStrategy keepAliveStrategy = this.keepAliveStrategy; if (keepAliveStrategy == null) { keepAliveStrategy = DefaultConnectionKeepAliveStrategy.INSTANCE; } AuthenticationStrategy targetAuthStrategy = this.targetAuthStrategy; if (targetAuthStrategy == null) { targetAuthStrategy = TargetAuthenticationStrategy.INSTANCE; } AuthenticationStrategy proxyAuthStrategy = this.proxyAuthStrategy; if (proxyAuthStrategy == null) { proxyAuthStrategy = ProxyAuthenticationStrategy.INSTANCE; } UserTokenHandler userTokenHandler = this.userTokenHandler; if (userTokenHandler == null) { if (!connectionStateDisabled) { userTokenHandler = DefaultAsyncUserTokenHandler.INSTANCE; } else { userTokenHandler = NoopUserTokenHandler.INSTANCE; } } SchemePortResolver schemePortResolver = this.schemePortResolver; if (schemePortResolver == null) { schemePortResolver = DefaultSchemePortResolver.INSTANCE; } HttpProcessor httpprocessor = this.httpprocessor; if (httpprocessor == null) { String userAgent = this.userAgent; if (userAgent == null) { if (systemProperties) { userAgent = System.getProperty("http.agent"); } if (userAgent == null) { userAgent = VersionInfo.getUserAgent("Apache-HttpAsyncClient", "org.apache.http.nio.client", getClass()); } } final HttpProcessorBuilder b = HttpProcessorBuilder.create(); if (requestFirst != null) { for (final HttpRequestInterceptor i : requestFirst) { b.addFirst(i); } } if (responseFirst != null) { for (final HttpResponseInterceptor i : responseFirst) { b.addFirst(i); } } b.addAll(new RequestDefaultHeaders(defaultHeaders), new RequestContent(), new RequestTargetHost(), new RequestClientConnControl(), new RequestUserAgent(userAgent), new RequestExpectContinue()); if (!cookieManagementDisabled) { b.add(new RequestAddCookies()); } if (!authCachingDisabled) { b.add(new RequestAuthCache()); } if (!cookieManagementDisabled) { b.add(new ResponseProcessCookies()); } if (requestLast != null) { for (final HttpRequestInterceptor i : requestLast) { b.addLast(i); } } if (responseLast != null) { for (final HttpResponseInterceptor i : responseLast) { b.addLast(i); } } httpprocessor = b.build(); } // Add redirect executor, if not disabled HttpRoutePlanner routePlanner = this.routePlanner; if (routePlanner == null) { if (proxy != null) { routePlanner = new DefaultProxyRoutePlanner(proxy, schemePortResolver); } else if (systemProperties) { routePlanner = new SystemDefaultRoutePlanner(schemePortResolver, ProxySelector.getDefault()); } else { routePlanner = new DefaultRoutePlanner(schemePortResolver); } } Lookup<AuthSchemeProvider> authSchemeRegistry = this.authSchemeRegistry; if (authSchemeRegistry == null) { authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create() .register(AuthSchemes.BASIC, new BasicSchemeFactory()) .register(AuthSchemes.DIGEST, new DigestSchemeFactory()) .register(AuthSchemes.NTLM, new NTLMSchemeFactory()) .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory()) .register(AuthSchemes.KERBEROS, new KerberosSchemeFactory()).build(); } Lookup<CookieSpecProvider> cookieSpecRegistry = this.cookieSpecRegistry; if (cookieSpecRegistry == null) { final CookieSpecProvider defaultProvider = new DefaultCookieSpecProvider(publicSuffixMatcher); final CookieSpecProvider laxStandardProvider = new RFC6265CookieSpecProvider( RFC6265CookieSpecProvider.CompatibilityLevel.RELAXED, publicSuffixMatcher); final CookieSpecProvider strictStandardProvider = new RFC6265CookieSpecProvider( RFC6265CookieSpecProvider.CompatibilityLevel.STRICT, publicSuffixMatcher); cookieSpecRegistry = RegistryBuilder.<CookieSpecProvider>create() .register(CookieSpecs.DEFAULT, defaultProvider).register("best-match", defaultProvider) .register("compatibility", defaultProvider).register(CookieSpecs.STANDARD, laxStandardProvider) .register(CookieSpecs.STANDARD_STRICT, strictStandardProvider) .register(CookieSpecs.NETSCAPE, new NetscapeDraftSpecProvider()) .register(CookieSpecs.IGNORE_COOKIES, new IgnoreSpecProvider()).build(); } CookieStore defaultCookieStore = this.cookieStore; if (defaultCookieStore == null) { defaultCookieStore = new BasicCookieStore(); } CredentialsProvider defaultCredentialsProvider = this.credentialsProvider; if (defaultCredentialsProvider == null) { defaultCredentialsProvider = new BasicCredentialsProvider(); } RedirectStrategy redirectStrategy = this.redirectStrategy; if (redirectStrategy == null) { redirectStrategy = DefaultRedirectStrategy.INSTANCE; } RequestConfig defaultRequestConfig = this.defaultRequestConfig; if (defaultRequestConfig == null) { defaultRequestConfig = RequestConfig.DEFAULT; } final MainClientExec exec = new MainClientExec(httpprocessor, routePlanner, redirectStrategy, targetAuthStrategy, proxyAuthStrategy, userTokenHandler); ThreadFactory threadFactory = null; NHttpClientEventHandler eventHandler = null; if (!this.connManagerShared) { threadFactory = this.threadFactory; if (threadFactory == null) { threadFactory = Executors.defaultThreadFactory(); } eventHandler = this.eventHandler; if (eventHandler == null) { eventHandler = new HttpAsyncRequestExecutor(); } } return new InternalHttpAsyncClient(connManager, reuseStrategy, keepAliveStrategy, threadFactory, eventHandler, exec, cookieSpecRegistry, authSchemeRegistry, defaultCookieStore, defaultCredentialsProvider, defaultRequestConfig); } }