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/10/05 16:28:14 UTC

svn commit: r1529459 - in /httpcomponents/httpasyncclient/trunk/httpasyncclient/src: examples/org/apache/http/examples/nio/client/ main/java/org/apache/http/nio/client/

Author: olegk
Date: Sat Oct  5 14:28:14 2013
New Revision: 1529459

URL: http://svn.apache.org/r1529459
Log:
Added more examples; Javadoc updates

Added:
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientAuthentication.java
      - copied, changed from r1529441, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java   (with props)
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomContext.java
      - copied, changed from r1529441, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java   (with props)
Modified:
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java
    httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpAsyncClient.java

Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientAuthentication.java (from r1529441, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientAuthentication.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientAuthentication.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java&r1=1529441&r2=1529459&rev=1529459&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientAuthentication.java Sat Oct  5 14:28:14 2013
@@ -24,15 +24,12 @@
  * <http://www.apache.org/>.
  *
  */
-
 package org.apache.http.examples.nio.client;
 
-import org.apache.http.HttpHost;
 import org.apache.http.HttpResponse;
 import org.apache.http.auth.AuthScope;
 import org.apache.http.auth.UsernamePasswordCredentials;
 import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.BasicCredentialsProvider;
 import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
@@ -41,28 +38,24 @@ import org.apache.http.impl.nio.client.H
 import java.util.concurrent.Future;
 
 /**
- * This example demonstrates a basic asynchronous HTTP request / response exchange
- * over a secure connection tunneled through an authenticating proxy.
+ * A simple example that uses HttpClient to execute an HTTP request against
+ * a target site that requires user authentication.
  */
-public class AsyncClientProxyAuthentication {
+public class AsyncClientAuthentication {
 
-    public static void main(String[] args)throws Exception {
+    public static void main(String[] args) throws Exception {
         CredentialsProvider credsProvider = new BasicCredentialsProvider();
         credsProvider.setCredentials(
-                new AuthScope("someproxy", 8080),
+                new AuthScope("localhost", 443),
                 new UsernamePasswordCredentials("username", "password"));
         CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
                 .setDefaultCredentialsProvider(credsProvider)
                 .build();
         try {
-            httpclient.start();
-            HttpHost proxy = new HttpHost("someproxy", 8080);
-            RequestConfig config = RequestConfig.custom()
-                    .setProxy(proxy)
-                    .build();
-            HttpGet request = new HttpGet("https://issues.apache.org/");
-            request.setConfig(config);
-            Future<HttpResponse> future = httpclient.execute(request, null);
+            HttpGet httpget = new HttpGet("http://localhost/");
+
+            System.out.println("Executing request " + httpget.getRequestLine());
+            Future<HttpResponse> future = httpclient.execute(httpget, null);
             HttpResponse response = future.get();
             System.out.println("Response: " + response.getStatusLine());
             System.out.println("Shutting down");
@@ -70,5 +63,4 @@ public class AsyncClientProxyAuthenticat
             httpclient.close();
         }
     }
-
 }

Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java?rev=1529459&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java Sat Oct  5 14:28:14 2013
@@ -0,0 +1,277 @@
+/*
+ * ====================================================================
+ * 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 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.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.BrowserCompatHostnameVerifier;
+import org.apache.http.conn.ssl.SSLContexts;
+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.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;
+
+import javax.net.ssl.SSLContext;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.charset.CodingErrorAction;
+import java.util.Arrays;
+import java.util.concurrent.Future;
+
+/**
+ * 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.
+        X509HostnameVerifier hostnameVerifier = new BrowserCompatHostnameVerifier();
+
+        // 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();
+        // 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))
+            .build();
+
+        // Create an HttpClient with the given custom dependencies and configuration.
+        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
+            .setConnectionManager(connManager)
+            .setDefaultCookieStore(cookieStore)
+            .setDefaultCredentialsProvider(credentialsProvider)
+            .setProxy(new HttpHost("myproxy", 8080))
+            .setDefaultRequestConfig(defaultRequestConfig)
+            .build();
+
+        try {
+            HttpGet httpget = new HttpGet("http://localhost/");
+            // 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("myotherproxy", 8080))
+                .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();
+        }
+    }
+
+}
+

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientConfiguration.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomContext.java (from r1529441, httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java)
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomContext.java?p2=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomContext.java&p1=httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java&r1=1529441&r2=1529459&rev=1529459&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientCustomContext.java Sat Oct  5 14:28:14 2013
@@ -27,44 +27,52 @@
 
 package org.apache.http.examples.nio.client;
 
-import org.apache.http.HttpHost;
 import org.apache.http.HttpResponse;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.CookieStore;
 import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.cookie.Cookie;
+import org.apache.http.impl.client.BasicCookieStore;
 import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
 import org.apache.http.impl.nio.client.HttpAsyncClients;
 
+import java.util.List;
 import java.util.concurrent.Future;
 
 /**
- * This example demonstrates a basic asynchronous HTTP request / response exchange
- * over a secure connection tunneled through an authenticating proxy.
+ * This example demonstrates the use of a local HTTP context populated with
+ * custom attributes.
  */
-public class AsyncClientProxyAuthentication {
+public class AsyncClientCustomContext {
 
-    public static void main(String[] args)throws Exception {
-        CredentialsProvider credsProvider = new BasicCredentialsProvider();
-        credsProvider.setCredentials(
-                new AuthScope("someproxy", 8080),
-                new UsernamePasswordCredentials("username", "password"));
-        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
-                .setDefaultCredentialsProvider(credsProvider)
-                .build();
+    public final static void main(String[] args) throws Exception {
+        CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
         try {
+            // Create a local instance of cookie store
+            CookieStore cookieStore = new BasicCookieStore();
+
+            // Create local HTTP context
+            HttpClientContext localContext = HttpClientContext.create();
+            // Bind custom cookie store to the local context
+            localContext.setCookieStore(cookieStore);
+
+            HttpGet httpget = new HttpGet("http://localhost/");
+            System.out.println("Executing request " + httpget.getRequestLine());
+
             httpclient.start();
-            HttpHost proxy = new HttpHost("someproxy", 8080);
-            RequestConfig config = RequestConfig.custom()
-                    .setProxy(proxy)
-                    .build();
-            HttpGet request = new HttpGet("https://issues.apache.org/");
-            request.setConfig(config);
-            Future<HttpResponse> future = httpclient.execute(request, null);
+
+            // 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());
+            List<Cookie> cookies = cookieStore.getCookies();
+            for (int i = 0; i < cookies.size(); i++) {
+                System.out.println("Local cookie: " + cookies.get(i));
+            }
             System.out.println("Shutting down");
         } finally {
             httpclient.close();
@@ -72,3 +80,4 @@ public class AsyncClientProxyAuthenticat
     }
 
 }
+

Added: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java?rev=1529459&view=auto
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java (added)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java Sat Oct  5 14:28:14 2013
@@ -0,0 +1,142 @@
+/*
+ * ====================================================================
+ * 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 org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.concurrent.FutureCallback;
+import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
+import org.apache.http.impl.nio.client.HttpAsyncClients;
+import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
+import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
+import org.apache.http.nio.conn.NHttpClientConnectionManager;
+import org.apache.http.nio.reactor.ConnectingIOReactor;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Example demonstrating how to evict expired and idle connections
+ * from the connection pool.
+ */
+public class AsyncClientEvictExpiredConnections {
+
+    public static void main(String[] args) throws Exception {
+        ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor();
+        PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor);
+        cm.setMaxTotal(100);
+        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
+                .setConnectionManager(cm)
+                .build();
+        try {
+            httpclient.start();
+
+            // create an array of URIs to perform GETs on
+            String[] urisToGet = {
+                "http://hc.apache.org/",
+                "http://hc.apache.org/httpcomponents-core-ga/",
+                "http://hc.apache.org/httpcomponents-client-ga/",
+            };
+
+            IdleConnectionEvictor connEvictor = new IdleConnectionEvictor(cm);
+            connEvictor.start();
+
+            final CountDownLatch latch = new CountDownLatch(urisToGet.length);
+            for (final String uri: urisToGet) {
+                final HttpGet httpget = new HttpGet(uri);
+                httpclient.execute(httpget, new FutureCallback<HttpResponse>() {
+
+                    public void completed(final HttpResponse response) {
+                        latch.countDown();
+                        System.out.println(httpget.getRequestLine() + "->" + response.getStatusLine());
+                    }
+
+                    public void failed(final Exception ex) {
+                        latch.countDown();
+                        System.out.println(httpget.getRequestLine() + "->" + ex);
+                    }
+
+                    public void cancelled() {
+                        latch.countDown();
+                        System.out.println(httpget.getRequestLine() + " cancelled");
+                    }
+
+                });
+            }
+            latch.await();
+
+            // Sleep 10 sec and let the connection evictor do its job
+            Thread.sleep(20000);
+
+            // Shut down the evictor thread
+            connEvictor.shutdown();
+            connEvictor.join();
+
+        } finally {
+            httpclient.close();
+        }
+    }
+
+    public static class IdleConnectionEvictor extends Thread {
+
+        private final NHttpClientConnectionManager connMgr;
+
+        private volatile boolean shutdown;
+
+        public IdleConnectionEvictor(NHttpClientConnectionManager connMgr) {
+            super();
+            this.connMgr = connMgr;
+        }
+
+        @Override
+        public void run() {
+            try {
+                while (!shutdown) {
+                    synchronized (this) {
+                        wait(5000);
+                        // Close expired connections
+                        connMgr.closeExpiredConnections();
+                        // Optionally, close connections
+                        // that have been idle longer than 5 sec
+                        connMgr.closeIdleConnections(5, TimeUnit.SECONDS);
+                    }
+                }
+            } catch (InterruptedException ex) {
+                // terminate
+            }
+        }
+
+        public void shutdown() {
+            shutdown = true;
+            synchronized (this) {
+                notifyAll();
+            }
+        }
+
+    }
+
+}

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientEvictExpiredConnections.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java?rev=1529459&r1=1529458&r2=1529459&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/examples/org/apache/http/examples/nio/client/AsyncClientProxyAuthentication.java Sat Oct  5 14:28:14 2013
@@ -60,9 +60,9 @@ public class AsyncClientProxyAuthenticat
             RequestConfig config = RequestConfig.custom()
                     .setProxy(proxy)
                     .build();
-            HttpGet request = new HttpGet("https://issues.apache.org/");
-            request.setConfig(config);
-            Future<HttpResponse> future = httpclient.execute(request, null);
+            HttpGet httpget = new HttpGet("https://issues.apache.org/");
+            httpget.setConfig(config);
+            Future<HttpResponse> future = httpclient.execute(httpget, null);
             HttpResponse response = future.get();
             System.out.println("Response: " + response.getStatusLine());
             System.out.println("Shutting down");

Modified: httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpAsyncClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpAsyncClient.java?rev=1529459&r1=1529458&r2=1529459&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpAsyncClient.java (original)
+++ httpcomponents/httpasyncclient/trunk/httpasyncclient/src/main/java/org/apache/http/nio/client/HttpAsyncClient.java Sat Oct  5 14:28:14 2013
@@ -54,6 +54,9 @@ public interface HttpAsyncClient {
      * a request message and stream out its content without buffering it
      * in memory. The response consumer passed to this method will be used
      * to process a response message without buffering its content in memory.
+     * <p/>
+     * Please note it may be unsafe to interact with the context instance
+     * while the request is still being executed.
      *
      * @param <T> the result type of request execution.
      * @param requestProducer request producer callback.
@@ -91,6 +94,9 @@ public interface HttpAsyncClient {
     /**
      * Initiates asynchronous HTTP request execution against the given target
      * using the given context.
+     * <p/>
+     * Please note it may be unsafe to interact with the context instance
+     * while the request is still being executed.
      *
      * @param target    the target host for the request.
      *                  Implementations may accept <code>null</code>
@@ -125,6 +131,9 @@ public interface HttpAsyncClient {
     /**
      * Initiates asynchronous HTTP request execution using the given
      * context.
+     * <p/>
+     * Please note it may be unsafe to interact with the context instance
+     * while the request is still being executed.
      *
      * @param request   the request to execute
      * @param context HTTP context