| /* |
| * ==================================================================== |
| * 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.examples.nio.client; |
| |
| import java.net.InetAddress; |
| import java.net.UnknownHostException; |
| import java.nio.charset.CodingErrorAction; |
| import java.util.Arrays; |
| import java.util.concurrent.Future; |
| |
| import javax.net.ssl.HostnameVerifier; |
| import javax.net.ssl.SSLContext; |
| |
| import org.apache.http.Consts; |
| import org.apache.http.Header; |
| import org.apache.http.HttpHost; |
| import org.apache.http.HttpRequest; |
| import org.apache.http.HttpResponse; |
| import org.apache.http.ParseException; |
| import org.apache.http.auth.AuthScope; |
| import org.apache.http.auth.UsernamePasswordCredentials; |
| import org.apache.http.client.CookieStore; |
| import org.apache.http.client.CredentialsProvider; |
| 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.methods.HttpGet; |
| import org.apache.http.client.protocol.HttpClientContext; |
| import org.apache.http.config.ConnectionConfig; |
| import org.apache.http.config.MessageConstraints; |
| import org.apache.http.config.Registry; |
| import org.apache.http.config.RegistryBuilder; |
| import org.apache.http.conn.DnsResolver; |
| import org.apache.http.conn.routing.HttpRoute; |
| import org.apache.http.conn.ssl.DefaultHostnameVerifier; |
| import org.apache.http.conn.ssl.SSLContexts; |
| import org.apache.http.impl.DefaultHttpResponseFactory; |
| import org.apache.http.impl.client.BasicCookieStore; |
| import org.apache.http.impl.client.BasicCredentialsProvider; |
| import org.apache.http.impl.conn.SystemDefaultDnsResolver; |
| import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; |
| import org.apache.http.impl.nio.client.HttpAsyncClients; |
| import org.apache.http.impl.nio.codecs.DefaultHttpRequestWriterFactory; |
| import org.apache.http.impl.nio.codecs.DefaultHttpResponseParser; |
| import org.apache.http.impl.nio.codecs.DefaultHttpResponseParserFactory; |
| import org.apache.http.impl.nio.conn.ManagedNHttpClientConnectionFactory; |
| import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager; |
| import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; |
| import org.apache.http.impl.nio.reactor.IOReactorConfig; |
| import org.apache.http.message.BasicHeader; |
| import org.apache.http.message.BasicLineParser; |
| import org.apache.http.message.LineParser; |
| import org.apache.http.nio.NHttpMessageParser; |
| import org.apache.http.nio.NHttpMessageParserFactory; |
| import org.apache.http.nio.NHttpMessageWriterFactory; |
| import org.apache.http.nio.conn.ManagedNHttpClientConnection; |
| import org.apache.http.nio.conn.NHttpConnectionFactory; |
| 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.reactor.ConnectingIOReactor; |
| import org.apache.http.nio.reactor.SessionInputBuffer; |
| import org.apache.http.nio.util.HeapByteBufferAllocator; |
| import org.apache.http.util.CharArrayBuffer; |
| |
| /** |
| * This example demonstrates how to customize and configure the most common aspects |
| * of HTTP request execution and connection management. |
| */ |
| public class AsyncClientConfiguration { |
| |
| public final static void main(String[] args) throws Exception { |
| |
| // Use custom message parser / writer to customize the way HTTP |
| // messages are parsed from and written out to the data stream. |
| NHttpMessageParserFactory<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() { |
| |
| @Override |
| public NHttpMessageParser<HttpResponse> create( |
| final SessionInputBuffer buffer, |
| final MessageConstraints constraints) { |
| LineParser lineParser = new BasicLineParser() { |
| |
| @Override |
| public Header parseHeader(final CharArrayBuffer buffer) { |
| try { |
| return super.parseHeader(buffer); |
| } catch (ParseException ex) { |
| return new BasicHeader(buffer.toString(), null); |
| } |
| } |
| |
| }; |
| return new DefaultHttpResponseParser( |
| buffer, lineParser, DefaultHttpResponseFactory.INSTANCE, constraints); |
| } |
| |
| }; |
| NHttpMessageWriterFactory<HttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory(); |
| |
| // Use a custom connection factory to customize the process of |
| // initialization of outgoing HTTP connections. Beside standard connection |
| // configuration parameters HTTP connection factory can define message |
| // parser / writer routines to be employed by individual connections. |
| NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory = new ManagedNHttpClientConnectionFactory( |
| requestWriterFactory, responseParserFactory, HeapByteBufferAllocator.INSTANCE); |
| |
| // Client HTTP connection objects when fully initialized can be bound to |
| // an arbitrary network socket. The process of network socket initialization, |
| // its connection to a remote address and binding to a local one is controlled |
| // by a connection socket factory. |
| |
| // SSL context for secure connections can be created either based on |
| // system or application specific properties. |
| SSLContext sslcontext = SSLContexts.createSystemDefault(); |
| // Use custom hostname verifier to customize SSL hostname verification. |
| HostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(); |
| |
| // Create a registry of custom connection session strategies for supported |
| // protocol schemes. |
| Registry<SchemeIOSessionStrategy> sessionStrategyRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create() |
| .register("http", NoopIOSessionStrategy.INSTANCE) |
| .register("https", new SSLIOSessionStrategy(sslcontext, hostnameVerifier)) |
| .build(); |
| |
| // Use custom DNS resolver to override the system DNS resolution. |
| DnsResolver dnsResolver = new SystemDefaultDnsResolver() { |
| |
| @Override |
| public InetAddress[] resolve(final String host) throws UnknownHostException { |
| if (host.equalsIgnoreCase("myhost")) { |
| return new InetAddress[] { InetAddress.getByAddress(new byte[] {127, 0, 0, 1}) }; |
| } else { |
| return super.resolve(host); |
| } |
| } |
| |
| }; |
| |
| // Create I/O reactor configuration |
| IOReactorConfig ioReactorConfig = IOReactorConfig.custom() |
| .setIoThreadCount(Runtime.getRuntime().availableProcessors()) |
| .setConnectTimeout(30000) |
| .setSoTimeout(30000) |
| .build(); |
| |
| // Create a custom I/O reactort |
| ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig); |
| |
| // Create a connection manager with custom configuration. |
| PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager( |
| ioReactor, connFactory, sessionStrategyRegistry, dnsResolver); |
| |
| // Create message constraints |
| MessageConstraints messageConstraints = MessageConstraints.custom() |
| .setMaxHeaderCount(200) |
| .setMaxLineLength(2000) |
| .build(); |
| // Create connection configuration |
| ConnectionConfig connectionConfig = ConnectionConfig.custom() |
| .setMalformedInputAction(CodingErrorAction.IGNORE) |
| .setUnmappableInputAction(CodingErrorAction.IGNORE) |
| .setCharset(Consts.UTF_8) |
| .setMessageConstraints(messageConstraints) |
| .build(); |
| // Configure the connection manager to use connection configuration either |
| // by default or for a specific host. |
| connManager.setDefaultConnectionConfig(connectionConfig); |
| connManager.setConnectionConfig(new HttpHost("somehost", 80), ConnectionConfig.DEFAULT); |
| |
| // Configure total max or per route limits for persistent connections |
| // that can be kept in the pool or leased by the connection manager. |
| connManager.setMaxTotal(100); |
| connManager.setDefaultMaxPerRoute(10); |
| connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 20); |
| |
| // Use custom cookie store if necessary. |
| CookieStore cookieStore = new BasicCookieStore(); |
| // Use custom credentials provider if necessary. |
| CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); |
| credentialsProvider.setCredentials(new AuthScope("localhost", 8889), new UsernamePasswordCredentials("squid", "nopassword")); |
| // Create global request configuration |
| RequestConfig defaultRequestConfig = RequestConfig.custom() |
| .setCookieSpec(CookieSpecs.DEFAULT) |
| .setExpectContinueEnabled(true) |
| .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST)) |
| .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)) |
| .build(); |
| |
| // Create an HttpClient with the given custom dependencies and configuration. |
| CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom() |
| .setConnectionManager(connManager) |
| .setDefaultCookieStore(cookieStore) |
| .setDefaultCredentialsProvider(credentialsProvider) |
| .setProxy(new HttpHost("localhost", 8889)) |
| .setDefaultRequestConfig(defaultRequestConfig) |
| .build(); |
| |
| try { |
| HttpGet httpget = new HttpGet("http://httpbin.org/get"); |
| // Request configuration can be overridden at the request level. |
| // They will take precedence over the one set at the client level. |
| RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig) |
| .setSocketTimeout(5000) |
| .setConnectTimeout(5000) |
| .setConnectionRequestTimeout(5000) |
| .setProxy(new HttpHost("localhost", 8888)) |
| .build(); |
| httpget.setConfig(requestConfig); |
| |
| // Execution context can be customized locally. |
| HttpClientContext localContext = HttpClientContext.create(); |
| // Contextual attributes set the local context level will take |
| // precedence over those set at the client level. |
| localContext.setCookieStore(cookieStore); |
| localContext.setCredentialsProvider(credentialsProvider); |
| |
| System.out.println("Executing request " + httpget.getRequestLine()); |
| |
| httpclient.start(); |
| |
| // Pass local context as a parameter |
| Future<HttpResponse> future = httpclient.execute(httpget, localContext, null); |
| |
| // Please note that it may be unsafe to access HttpContext instance |
| // while the request is still being executed |
| |
| HttpResponse response = future.get(); |
| System.out.println("Response: " + response.getStatusLine()); |
| |
| // Once the request has been executed the local context can |
| // be used to examine updated state and various objects affected |
| // by the request execution. |
| |
| // Last executed request |
| localContext.getRequest(); |
| // Execution route |
| localContext.getHttpRoute(); |
| // Target auth state |
| localContext.getTargetAuthState(); |
| // Proxy auth state |
| localContext.getTargetAuthState(); |
| // Cookie origin |
| localContext.getCookieOrigin(); |
| // Cookie spec used |
| localContext.getCookieSpec(); |
| // User security token |
| localContext.getUserToken(); |
| } finally { |
| httpclient.close(); |
| } |
| } |
| |
| } |
| |