You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2013/01/06 17:13:34 UTC
svn commit: r1429548 - in /httpcomponents/httpclient/trunk/httpclient/src:
examples/org/apache/http/examples/client/
main/java/org/apache/http/conn/ssl/ main/java/org/apache/http/impl/conn/
Author: olegk
Date: Sun Jan 6 16:13:33 2013
New Revision: 1429548
URL: http://svn.apache.org/viewvc?rev=1429548&view=rev
Log:
Updated ClientWithResponseHandler example; added ClientConfiguration example; added overloaded constructors to a number of default impl classes
Added:
httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java (with props)
Removed:
httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientExecuteDirect.java
Modified:
httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientWithResponseHandler.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultClientConnectionFactory.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultHttpResponseParserFactory.java
httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.java
Added: httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java?rev=1429548&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java (added)
+++ httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java Sun Jan 6 16:13:33 2013
@@ -0,0 +1,240 @@
+/*
+ * ====================================================================
+ * 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.client;
+
+import java.nio.charset.CodingErrorAction;
+import java.util.Arrays;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.http.Consts;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpResponseFactory;
+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.CloseableHttpResponse;
+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.config.SocketConfig;
+import org.apache.http.conn.DnsResolver;
+import org.apache.http.conn.HttpConnectionFactory;
+import org.apache.http.conn.SocketClientConnection;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainSocketFactory;
+import org.apache.http.conn.ssl.BrowserCompatHostnameVerifier;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.conn.ssl.X509HostnameVerifier;
+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.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.DefaultClientConnectionFactory;
+import org.apache.http.impl.conn.DefaultHttpResponseParserFactory;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.impl.conn.SystemDefaultDnsResolver;
+import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
+import org.apache.http.io.HttpMessageParserFactory;
+import org.apache.http.io.HttpMessageWriterFactory;
+
+/**
+ * This example demonstrates how to customize and configure the most common aspects
+ * of HTTP request execution and connection management.
+ */
+public class ClientConfiguration {
+
+ public final static void main(String[] args) throws Exception {
+
+ // Use a custom response factory to customize the way HTTP response
+ // objects are generated.
+ HttpResponseFactory responseFactory = new DefaultHttpResponseFactory();
+
+ // Use custom message parser / writer to customize the way HTTP
+ // messages are parsed from and written out to the data stream.
+ HttpMessageParserFactory<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory(
+ responseFactory);
+ HttpMessageWriterFactory<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 control the size of
+ // input / output buffers as well as determine message parser / writer routines
+ // to be employed by individual connections.
+ HttpConnectionFactory<SocketClientConnection> connFactory = new DefaultClientConnectionFactory(
+ 8 * 1024, requestWriterFactory, responseParserFactory);
+
+ // 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 = SSLSocketFactory.createSystemSSLContext();
+ // Use custom hostname verifier to customize SSL hostname verification.
+ X509HostnameVerifier hostnameVerifier = new BrowserCompatHostnameVerifier();
+
+ // 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();
+
+ // Use custom DNS resolver to override the system DNS resolution.
+ DnsResolver dnsResolver = new SystemDefaultDnsResolver();
+
+ // Create a connection manager with custom configuration.
+ PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
+ socketFactoryRegistry, connFactory, dnsResolver);
+
+ // Create socket configuration
+ SocketConfig socketConfig = SocketConfig.custom()
+ .setTcpNoDelay(true)
+ .build();
+ // Configure the connection manager to use socket configuration either
+ // by default or for a specific host.
+ connManager.setDefaultSocketConfig(socketConfig);
+ connManager.setSocketConfig(new HttpHost("somehost", 80), socketConfig);
+
+ // 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();
+ // Create global request configuration
+ RequestConfig defaultRequestConfig = RequestConfig.custom()
+ .setCookieSpec(CookieSpecs.BEST_MATCH)
+ .setExpectContinueEnabled(true)
+ .setStaleConnectionCheckEnabled(true)
+ .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
+ .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))
+ .setDefaultProxy(new HttpHost("myproxy", 8080))
+ .build();
+
+ // Create an HttpClient with the given custom dependencies and configuration.
+ CloseableHttpClient httpclient = HttpClients.custom()
+ .setConnectionManager(connManager)
+ .setCookieStore(cookieStore)
+ .setCredentialsProvider(credentialsProvider)
+ .setDefaultRequestConfig(defaultRequestConfig)
+ .build();
+
+ try {
+ HttpGet httpget = new HttpGet("http://www.apache.org/");
+ // 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)
+ .build();
+ httpget.setConfig(requestConfig);
+
+ // Execution context can be customized locally.
+ HttpClientContext context = HttpClientContext.create();
+ // Contextual attributes set the local context level will take
+ // precedence over those set at the client level.
+ context.setCookieStore(cookieStore);
+ context.setCredentialsProvider(credentialsProvider);
+ context.setSocketFactoryRegistry(socketFactoryRegistry);
+
+ System.out.println("executing request " + httpget.getURI());
+ CloseableHttpResponse response = httpclient.execute(httpget, context);
+ try {
+ HttpEntity entity = response.getEntity();
+
+ System.out.println("----------------------------------------");
+ System.out.println(response.getStatusLine());
+ if (entity != null) {
+ System.out.println("Response content length: " + entity.getContentLength());
+ }
+ System.out.println("----------------------------------------");
+
+ // 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
+ 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();
+ }
+ } finally {
+ httpclient.close();
+ }
+ }
+
+}
+
Propchange: httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientConfiguration.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientWithResponseHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientWithResponseHandler.java?rev=1429548&r1=1429547&r2=1429548&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientWithResponseHandler.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/examples/org/apache/http/examples/client/ClientWithResponseHandler.java Sun Jan 6 16:13:33 2013
@@ -27,11 +27,16 @@
package org.apache.http.examples.client;
+import java.io.IOException;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
/**
* This example demonstrates the use of the {@link ResponseHandler} to simplify
@@ -46,8 +51,21 @@ public class ClientWithResponseHandler {
System.out.println("executing request " + httpget.getURI());
- // Create a response handler
- ResponseHandler<String> responseHandler = new BasicResponseHandler();
+ // Create a custom response handler
+ ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
+
+ public String handleResponse(
+ final HttpResponse response) throws ClientProtocolException, IOException {
+ int status = response.getStatusLine().getStatusCode();
+ if (status >= 200 && status < 300) {
+ HttpEntity entity = response.getEntity();
+ return entity != null ? EntityUtils.toString(entity) : null;
+ } else {
+ throw new ClientProtocolException("Unexpected response status: " + status);
+ }
+ }
+
+ };
String responseBody = httpclient.execute(httpget, responseHandler);
System.out.println("----------------------------------------");
System.out.println(responseBody);
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java?rev=1429548&r1=1429547&r2=1429548&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/conn/ssl/SSLSocketFactory.java Sun Jan 6 16:13:33 2013
@@ -349,7 +349,10 @@ public class SSLSocketFactory implements
return sslcontext;
}
- private static SSLContext createDefaultSSLContext() throws SSLInitializationException {
+ /**
+ * @since 4.3
+ */
+ public static SSLContext createDefaultSSLContext() throws SSLInitializationException {
try {
return createSSLContext(TLS, null, null, null, null, null);
} catch (Exception ex) {
@@ -357,7 +360,10 @@ public class SSLSocketFactory implements
}
}
- private static SSLContext createSystemSSLContext() throws SSLInitializationException {
+ /**
+ * @since 4.3
+ */
+ public static SSLContext createSystemSSLContext() throws SSLInitializationException {
try {
return createSystemSSLContext(TLS, null);
} catch (Exception ex) {
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultClientConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultClientConnectionFactory.java?rev=1429548&r1=1429547&r2=1429548&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultClientConnectionFactory.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultClientConnectionFactory.java Sun Jan 6 16:13:33 2013
@@ -32,10 +32,16 @@ import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CodingErrorAction;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
import org.apache.http.annotation.Immutable;
import org.apache.http.config.ConnectionConfig;
import org.apache.http.conn.HttpConnectionFactory;
import org.apache.http.conn.SocketClientConnection;
+import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
+import org.apache.http.io.HttpMessageParserFactory;
+import org.apache.http.io.HttpMessageWriterFactory;
+import org.apache.http.util.Args;
/**
* @since 4.3
@@ -45,6 +51,36 @@ public class DefaultClientConnectionFact
public static final DefaultClientConnectionFactory INSTANCE = new DefaultClientConnectionFactory();
+ private final int bufferSize;
+ private final HttpMessageWriterFactory<HttpRequest> requestWriterFactory;
+ private final HttpMessageParserFactory<HttpResponse> responseParserFactory;
+
+ public DefaultClientConnectionFactory(
+ int bufferSize,
+ final HttpMessageWriterFactory<HttpRequest> requestWriterFactory,
+ final HttpMessageParserFactory<HttpResponse> responseParserFactory) {
+ super();
+ this.bufferSize = Args.notNegative(bufferSize, "Buffer size");
+ this.requestWriterFactory = requestWriterFactory != null ? requestWriterFactory :
+ DefaultHttpRequestWriterFactory.INSTANCE;
+ this.responseParserFactory = responseParserFactory != null ? responseParserFactory :
+ DefaultHttpResponseParserFactory.INSTANCE;
+ }
+
+ public DefaultClientConnectionFactory(
+ final HttpMessageParserFactory<HttpResponse> responseParserFactory) {
+ this(8 * 1024, null, responseParserFactory);
+ }
+
+ public DefaultClientConnectionFactory(
+ int bufferSize) {
+ this(bufferSize, null, null);
+ }
+
+ public DefaultClientConnectionFactory() {
+ this(8 * 1024, null, null);
+ }
+
public SocketClientConnection create(final ConnectionConfig config) {
ConnectionConfig cconfig = config != null ? config : ConnectionConfig.DEFAULT;
CharsetDecoder chardecoder = null;
@@ -62,11 +98,12 @@ public class DefaultClientConnectionFact
charencoder.onMalformedInput(malformedInputAction);
charencoder.onUnmappableCharacter(unmappableInputAction);
}
- return new SocketClientConnectionImpl(8 * 1024,
+ return new SocketClientConnectionImpl(bufferSize,
chardecoder, charencoder,
cconfig.getMessageConstraints(),
- null, null, null,
- DefaultHttpResponseParserFactory.INSTANCE);
+ null, null,
+ requestWriterFactory,
+ responseParserFactory);
}
}
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultHttpResponseParserFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultHttpResponseParserFactory.java?rev=1429548&r1=1429547&r2=1429548&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultHttpResponseParserFactory.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/DefaultHttpResponseParserFactory.java Sun Jan 6 16:13:33 2013
@@ -51,7 +51,8 @@ public class DefaultHttpResponseParserFa
private final LineParser lineParser;
private final HttpResponseFactory responseFactory;
- public DefaultHttpResponseParserFactory(final LineParser lineParser,
+ public DefaultHttpResponseParserFactory(
+ final LineParser lineParser,
final HttpResponseFactory responseFactory) {
super();
this.lineParser = lineParser != null ? lineParser : BasicLineParser.INSTANCE;
@@ -59,6 +60,11 @@ public class DefaultHttpResponseParserFa
: DefaultHttpResponseFactory.INSTANCE;
}
+ public DefaultHttpResponseParserFactory(
+ final HttpResponseFactory responseFactory) {
+ this(null, responseFactory);
+ }
+
public DefaultHttpResponseParserFactory() {
this(null, null);
}
Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.java?rev=1429548&r1=1429547&r2=1429548&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.java Sun Jan 6 16:13:33 2013
@@ -121,6 +121,13 @@ public class PoolingHttpClientConnection
public PoolingHttpClientConnectionManager(
final Registry<ConnectionSocketFactory> socketFactoryRegistry,
final HttpConnectionFactory<SocketClientConnection> connFactory,
+ final DnsResolver dnsResolver) {
+ this(socketFactoryRegistry, connFactory, null, dnsResolver, -1, TimeUnit.MILLISECONDS);
+ }
+
+ public PoolingHttpClientConnectionManager(
+ final Registry<ConnectionSocketFactory> socketFactoryRegistry,
+ final HttpConnectionFactory<SocketClientConnection> connFactory,
final long timeToLive, final TimeUnit tunit) {
this(socketFactoryRegistry, connFactory, null, null, timeToLive, tunit);
}