You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by Apache Wiki <wi...@apache.org> on 2013/01/11 14:31:52 UTC

[Httpcomponents Wiki] Update of "HttpClientConfiguration" by OlegKalnichevski

Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Httpcomponents Wiki" for change notification.

The "HttpClientConfiguration" page has been changed by OlegKalnichevski:
http://wiki.apache.org/HttpComponents/HttpClientConfiguration

New page:
= HttpClient configuration and prefernece API =

== HttpClient customization ==

HttpClient instances can be created either using HttpClientBuilder or factory methods of 
the HttpClients utility class.

This code snippet shows how to create HttpClient instance with default configuration. The instance 
will be configured to use a pool of connections with maximum two concurrent connections for 
the same route (host).

{{{
CloseableHttpClient client = HttpClients.createDefault();
}}}

This code snippet shows how to create an HttpClient instance based on system properties. 
The instance will be configured to use a pool of connections. The following system properties will 
be taken into account:

 * ssl.TrustManagerFactory.algorithm

 * javax.net.ssl.trustStoreType

 * javax.net.ssl.trustStore

 * javax.net.ssl.trustStoreProvider

 * javax.net.ssl.trustStorePassword

 * java.home

 * ssl.KeyManagerFactory.algorithm

 * javax.net.ssl.keyStoreType

 * javax.net.ssl.keyStore

 * javax.net.ssl.keyStoreProvider

 * javax.net.ssl.keyStorePassword

 * http.proxyHost

 * http.proxyPort

 * http.nonProxyHosts

 * http.keepAlive

 * http.maxConnections

 * http.agent


{{{
CloseableHttpClient client = HttpClients.createSystem();
}}}
This code snippet shows how to create an HttpClient instance with a minimal configuration. 
This instance will be configured to use a pool of connections with maximum two concurrent 
connections for the same route (host). The only request level configuration parameters that 
the minimal HttpClient takes into account are timeouts (socket, connect, and connection request). 
All other request parameters will have no effect on request execution.
  
{{{
CloseableHttpClient client = HttpClients.createMinimal();
}}}

Please note that HttpClient instances created with HttpClientBuilder or HttpClients are immutable.
Their configuration can no longer be altered. 

This code snippet shows how to create an HttpClient instance with a custom configuration. One can
disable certain protocol aspects such as automatic redirect handling to have them completely
removed from the request execution chain and make request execution more efficient.

{{{
CloseableHttpClient httpclient = HttpClients.custom()
    .disableAutomaticRetries()
    .disableConnectionState()
    .disableContentCompression()
    .disableRedirectHandling()
    .useSystemProperties()
    .build();
}}}

One can choose to configure HttpClient to use system properties and then explicitly override only
specific aspects through custom configuration.

{{{
CloseableHttpClient httpclient = HttpClients.custom()
    .useSystemProperties()
    .setProxy(new HttpHost("myproxy", 8080))
    .build();
}}}

== Request configuration ==

This code snippet shows how to create custom request configuration.

{{{
RequestConfig defaultRequestConfig = RequestConfig.custom()
    .setSocketTimeout(5000)
    .setConnectTimeout(5000)
    .setConnectionRequestTimeout(5000)
    .setStaleConnectionCheckEnabled(true)
    .build();
}}}

Request configuration can either be set at the client level as defaults for all requests without
explicit configuration or at the request level. 

{{{
CloseableHttpClient httpclient = HttpClients.custom()
    .setDefaultRequestConfig(defaultRequestConfig)
    .build();
}}}

Please note that requests do not automatically inherit client level request configuration, 
if it overridden at the request level. Configuration defaults must be explicitly copied.y

{{{
HttpGet httpget = new HttpGet("http://www.apache.org/");
RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
    .setProxy(new HttpHost("myotherproxy", 8080))
    .build();
httpget.setConfig(requestConfig);
}}}

== Request execution context == 

HTTP protocol processors used internall by HttpClient are state-less, that is, they maintain 
no conversational between individual HTTP exchanges. However, conversational state such as 
HTTP cookies or authentication details can be preserved in the execution context represented
by HttpClientContext class.

The execution context can be shared by multiple HTTP exchanges if they belong to the same logical 
HTTP session. The context can be set up with a particular state prior to executing the HTTP session.
The context will also be updated in the course of the session. The conversational state can be 
examined and updated after each individual HTTP exchange.  

Default settings and configuration at the client level will be automatically added to the execution 
context if not explicitly set in the context by the user. 

{{{
CloseableHttpClient httpclient = HttpClients.custom()
    .setDefaultCookieStore(defaultCookieStore)
    .setDefaultCredentialsProvider(defaultCredentialsProvider)
    .setDefaultRequestConfig(defaultRequestConfig)
    .build();

HttpClientContext context = HttpClientContext.create();
context.setCookieStore(customCookieStore);
context.setCredentialsProvider(customCredentialsProvider);
context.setRequestConfig(customRequestConfig)

HttpGet httpget = new HttpGet("http://www.apache.org/");
CloseableHttpResponse response = httpclient.execute(httpget, context);
try {
    // Last executed request
    context.getRequest();
    // Execution route
    context.getHttpRoute();
    // Target auth state
    context.getTargetAuthState();
    // Proxy auth state
    context.getTargetAuthState();
    // Cookie origin
    context.getCookieOrigin();
    // Cookie spec used
    context.getCookieSpec();
    // User security token
    context.getUserToken();

} finally {
    response.close();
}
}}}

== Connection management and configuration ==

This code snippet shows how to create a HttpClientConnectionManager instance that keeps a pool 
of re-usable persistent connections. By default the connection manager will allow no more than
2 concurrent connections for the same route and no more than 20 connections in total.  

{{{
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
}}}

These limits can be customized if desired. One can also specify a different maximum limit 
specifically for a particular host.

{{{
connManager.setMaxTotal(100);
connManager.setDefaultMaxPerRoute(10);
connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 20);
}}}

The PoolingHttpClientConnectionManager class can apply different configuration parameters 
to network sockets and HTTP connections. Socket and connection configuration can be set as
defaults or applied to a specific host.

This code snippet shows how to set socket configuration. 

{{{
SocketConfig defaultSocketConfig = SocketConfig.custom()
    .setTcpNoDelay(true)
    .build();
SocketConfig socketConfig = SocketConfig.custom()
    .setTcpNoDelay(true)
    .setSoKeepAlive(true)
    .setSoReuseAddress(true)
    .build();

connManager.setDefaultSocketConfig(defaultSocketConfig);
connManager.setSocketConfig(new HttpHost("somehost", 80), socketConfig);
}}}

This code snippet shows how to set socket configuration. 

{{{
MessageConstraints messageConstraints = MessageConstraints.custom()
    .setMaxHeaderCount(200)
    .setMaxLineLength(2000)
    .build();
ConnectionConfig defaultConnectionConfig = ConnectionConfig.custom()
    .setMessageConstraints(messageConstraints)
    .build();
ConnectionConfig connectionConfig = ConnectionConfig.custom()
    .setMessageConstraints(messageConstraints)
    .setMalformedInputAction(CodingErrorAction.IGNORE)
    .setUnmappableInputAction(CodingErrorAction.IGNORE)
    .setCharset(Consts.UTF_8)
    .build();
connManager.setDefaultConnectionConfig(defaultConnectionConfig);
connManager.setConnectionConfig(new HttpHost("somehost", 80), connectionConfig);
}}}

A custom connection factory can also be used to customize the process of initialization of 
outgoing HTTP connections. Beside standard connection configuration parameters HTTP connection 
factory can control the size of input / output buffers as well as determine message parser / writer 
routines to be employed by individual HTTP connections. Custom message parser / message writer
are responsible for marshaling / un-marshaling of HTTP messages transferred over the HTTP
connection. There are situations when one may want to employ a more lenient parsing when dealing
with broken or non-compliant server side scripts.  

{{{
HttpMessageParserFactory<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() {

    @Override
    public HttpMessageParser<HttpResponse> create(
        SessionInputBuffer buffer, MessageConstraints constraints) {
        LineParser lineParser = new BasicLineParser() {

            @Override
            public Header parseHeader(CharArrayBuffer buffer) {
                try {
                    return super.parseHeader(buffer);
                } catch (ParseException ex) {
                    return new BasicHeader(buffer.toString(), null);
                }
            }

        };
        return new DefaultHttpResponseParser(
            buffer, lineParser, DefaultHttpResponseFactory.INSTANCE, constraints) {

            @Override
            protected boolean reject(CharArrayBuffer line, int count) {
                // try to ignore all garbage preceding a status line infinitely
                return false;
            }

        };
    }

};
HttpMessageWriterFactory<HttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory();
HttpConnectionFactory<SocketClientConnection> connFactory = new DefaultClientConnectionFactory(
        8 * 1024, requestWriterFactory, responseParserFactory);
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(connFactory);
}}}

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. It is generally recommended to provide
a connection socket factory for SSL connections with a custom configuration as generally 
security requirements tend to be application specific.  

SSL context for secure connections can be created either based on system or application specific 
properties.

{{{
SSLContext sslcontext = SSLSocketFactory.createSystemSSLContext();
}}}

One can also choose a custom hostname verifier to customize the process of hostname verification.

{{{
X509HostnameVerifier hostnameVerifier = new BrowserCompatHostnameVerifier();
}}}

This code snippet shows how to create a registry of custom connection socket factories for 
supported protocol schemes.

{{{
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
    .register("http", PlainSocketFactory.INSTANCE)
    .register("https", new SSLSocketFactory(sslcontext, hostnameVerifier))
    .build();
}}}

One can use a 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);
        }
    }

};
}}}        

This code snippet shows how to put together a pooling HttpClientConnectionManager with 
custom connection factory, socket factories and DNS resolver

{{{
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
    socketFactoryRegistry, connFactory, dnsResolver);
}}}

Custom connection socket factories can also be provided at the request level through a local 
execution context. This will cause HttpClient to override the default socket initialization 
routines with those specified in the execution context. 

{{{
HttpClientContext context = HttpClientContext.create();
context.setSocketFactoryRegistry(socketFactoryRegistry);
}}}

Please note that if a custom HTTP connection is kept alive after the request execution it may be 
pooled and re-used for execution of other requests.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org