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 2017/05/01 12:39:18 UTC

svn commit: r1793320 [5/5] - in /httpcomponents/httpclient/trunk: httpclient5-testing/src/main/java/org/apache/hc/client5/testing/async/ httpclient5-testing/src/main/java/org/apache/hc/client5/testing/classic/ httpclient5-testing/src/test/java/org/apac...

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/AsyncClientConnectionOperator.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/AsyncClientConnectionOperator.java?rev=1793320&r1=1793319&r2=1793320&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/AsyncClientConnectionOperator.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/AsyncClientConnectionOperator.java Mon May  1 12:39:16 2017
@@ -74,6 +74,7 @@ final class AsyncClientConnectionOperato
             final HttpHost host,
             final SocketAddress localAddress,
             final TimeValue connectTimeout,
+            final Object attachment,
             final FutureCallback<ManagedAsyncClientConnection> callback) {
         Args.notNull(connectionInitiator, "Connection initiator");
         Args.notNull(host, "Host");
@@ -104,7 +105,8 @@ final class AsyncClientConnectionOperato
                         host,
                         remoteAddress,
                         localAddress,
-                        null, new SessionRequestCallback() {
+                        attachment,
+                        new SessionRequestCallback() {
 
                             @Override
                             public void completed(final SessionRequest request) {
@@ -116,7 +118,7 @@ final class AsyncClientConnectionOperato
                                             host,
                                             session.getLocalAddress(),
                                             session.getRemoteAddress(),
-                                            null);
+                                            request.getAttachment());
                                 }
                                 future.completed(connection);
                             }

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/ManagedAsyncClientConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/ManagedAsyncClientConnection.java?rev=1793320&r1=1793319&r2=1793320&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/ManagedAsyncClientConnection.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/ManagedAsyncClientConnection.java Mon May  1 12:39:16 2017
@@ -39,6 +39,7 @@ import org.apache.hc.core5.http.Endpoint
 import org.apache.hc.core5.http.HttpConnection;
 import org.apache.hc.core5.http.HttpVersion;
 import org.apache.hc.core5.http.ProtocolVersion;
+import org.apache.hc.core5.http.nio.command.ShutdownCommand;
 import org.apache.hc.core5.io.ShutdownType;
 import org.apache.hc.core5.reactor.Command;
 import org.apache.hc.core5.reactor.IOEventHandler;
@@ -85,7 +86,7 @@ final class ManagedAsyncClientConnection
             if (log.isDebugEnabled()) {
                 log.debug(getId() + ": Close connection");
             }
-            ioSession.close();
+            ioSession.addFirst(new ShutdownCommand(ShutdownType.GRACEFUL));
         }
     }
 

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java?rev=1793320&r1=1793319&r2=1793320&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java Mon May  1 12:39:16 2017
@@ -31,6 +31,7 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.hc.client5.http.DnsResolver;
@@ -151,10 +152,14 @@ public class PoolingAsyncClientConnectio
                 route, state, timeout, new FutureCallback<PoolEntry<HttpRoute, ManagedAsyncClientConnection>>() {
 
                     void leaseCompleted(final PoolEntry<HttpRoute, ManagedAsyncClientConnection> poolEntry) {
-                        resultFuture.completed(new InternalConnectionEndpoint(poolEntry));
                         if (log.isDebugEnabled()) {
                             log.debug("Connection leased: " + ConnPoolSupport.formatStats(poolEntry.getConnection(), route, state, pool));
                         }
+                        final AsyncConnectionEndpoint endpoint = new InternalConnectionEndpoint(poolEntry);
+                        if (log.isDebugEnabled()) {
+                            log.debug(ConnPoolSupport.getId(endpoint) + ": acquired " + ConnPoolSupport.getId(poolEntry.getConnection()));
+                        }
+                        resultFuture.completed(endpoint);
                     }
 
                     @Override
@@ -209,6 +214,9 @@ public class PoolingAsyncClientConnectio
         if (entry == null) {
             return;
         }
+        if (log.isDebugEnabled()) {
+            log.debug(ConnPoolSupport.getId(endpoint) + ": endpoint discarded");
+        }
         final ManagedAsyncClientConnection connection = entry.getConnection();
         boolean reusable = connection != null && connection.isOpen();
         try {
@@ -242,6 +250,7 @@ public class PoolingAsyncClientConnectio
             final AsyncConnectionEndpoint endpoint,
             final ConnectionInitiator connectionInitiator,
             final TimeValue timeout,
+            final Object attachment,
             final HttpContext context,
             final FutureCallback<AsyncConnectionEndpoint> callback) {
         Args.notNull(endpoint, "Endpoint");
@@ -263,12 +272,19 @@ public class PoolingAsyncClientConnectio
         }
         final InetSocketAddress localAddress = route.getLocalSocketAddress();
         final Future<ManagedAsyncClientConnection> connectFuture = connectionOperator.connect(
-                connectionInitiator, host, localAddress, timeout, new FutureCallback<ManagedAsyncClientConnection>() {
+                connectionInitiator, host, localAddress, timeout, attachment, new FutureCallback<ManagedAsyncClientConnection>() {
 
                     @Override
                     public void completed(final ManagedAsyncClientConnection connection) {
-                        poolEntry.assignConnection(connection);
-                        resultFuture.completed(new InternalConnectionEndpoint(poolEntry));
+                        try {
+                            if (log.isDebugEnabled()) {
+                                log.debug(ConnPoolSupport.getId(internalEndpoint) + ": connected " + ConnPoolSupport.getId(connection));
+                            }
+                            poolEntry.assignConnection(connection);
+                            resultFuture.completed(internalEndpoint);
+                        } catch (final RuntimeException ex) {
+                            resultFuture.failed(ex);
+                        }
                     }
 
                     @Override
@@ -294,7 +310,11 @@ public class PoolingAsyncClientConnectio
         final InternalConnectionEndpoint internalEndpoint = cast(endpoint);
         final PoolEntry<HttpRoute, ManagedAsyncClientConnection> poolEntry = internalEndpoint.getValidatedPoolEntry();
         final HttpRoute route = poolEntry.getRoute();
+        final ManagedAsyncClientConnection connection = poolEntry.getConnection();
         connectionOperator.upgrade(poolEntry.getConnection(), route.getTargetHost());
+        if (log.isDebugEnabled()) {
+            log.debug(ConnPoolSupport.getId(internalEndpoint) + ": upgraded " + ConnPoolSupport.getId(connection));
+        }
     }
 
     @Override
@@ -362,19 +382,21 @@ public class PoolingAsyncClientConnectio
         this.validateAfterInactivity = validateAfterInactivity;
     }
 
+    private static final AtomicLong COUNT = new AtomicLong(0);
+
     class InternalConnectionEndpoint extends AsyncConnectionEndpoint implements Identifiable {
 
         private final AtomicReference<PoolEntry<HttpRoute, ManagedAsyncClientConnection>> poolEntryRef;
+        private final String id;
 
         InternalConnectionEndpoint(final PoolEntry<HttpRoute, ManagedAsyncClientConnection> poolEntry) {
             this.poolEntryRef = new AtomicReference<>(poolEntry);
+            this.id = "ep-" + Long.toHexString(COUNT.incrementAndGet());
         }
 
         @Override
         public String getId() {
-            final PoolEntry<HttpRoute, ManagedAsyncClientConnection> poolEntry = poolEntryRef.get();
-            final ManagedAsyncClientConnection connection = poolEntry != null ? poolEntry.getConnection() : null;
-            return ConnPoolSupport.getId(connection);
+            return id;
         }
 
         PoolEntry<HttpRoute, ManagedAsyncClientConnection> getPoolEntry() {
@@ -400,6 +422,9 @@ public class PoolingAsyncClientConnectio
         public void shutdown() throws IOException {
             final PoolEntry<HttpRoute, ManagedAsyncClientConnection> poolEntry = poolEntryRef.get();
             if (poolEntry != null) {
+                if (log.isDebugEnabled()) {
+                    log.debug(id + ": shutdown " + ShutdownType.IMMEDIATE);
+                }
                 poolEntry.discardConnection(ShutdownType.IMMEDIATE);
             }
         }
@@ -408,6 +433,9 @@ public class PoolingAsyncClientConnectio
         public void close() throws IOException {
             final PoolEntry<HttpRoute, ManagedAsyncClientConnection> poolEntry = poolEntryRef.get();
             if (poolEntry != null) {
+                if (log.isDebugEnabled()) {
+                    log.debug(id + ": shutdown " + ShutdownType.GRACEFUL);
+                }
                 poolEntry.discardConnection(ShutdownType.GRACEFUL);
             }
         }
@@ -416,10 +444,18 @@ public class PoolingAsyncClientConnectio
         public boolean isConnected() {
             final PoolEntry<HttpRoute, ManagedAsyncClientConnection> poolEntry = poolEntryRef.get();
             if (poolEntry == null) {
-                throw new ConnectionShutdownException();
+                return false;
             }
             final ManagedAsyncClientConnection connection = poolEntry.getConnection();
-            return connection != null && connection.isOpen();
+            if (connection == null) {
+                return false;
+            } else {
+                if (!connection.isOpen()) {
+                    poolEntry.discardConnection(ShutdownType.IMMEDIATE);
+                    return false;
+                }
+                return true;
+            }
         }
 
         @Override
@@ -430,6 +466,9 @@ public class PoolingAsyncClientConnectio
         @Override
         public void execute(final AsyncClientExchangeHandler exchangeHandler, final HttpContext context) {
             final ManagedAsyncClientConnection connection = getValidatedPoolEntry().getConnection();
+            if (log.isDebugEnabled()) {
+                log.debug(id + ": executing exchange " + ConnPoolSupport.getId(exchangeHandler) + " over " + ConnPoolSupport.getId(connection));
+            }
             connection.submitCommand(new ExecutionCommand(exchangeHandler, context));
         }
 

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ExecRuntimeImpl.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ExecRuntimeImpl.java?rev=1793320&r1=1793319&r2=1793320&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ExecRuntimeImpl.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/impl/sync/ExecRuntimeImpl.java Mon May  1 12:39:16 2017
@@ -47,6 +47,7 @@ import org.apache.hc.core5.http.Connecti
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
 import org.apache.hc.core5.io.ShutdownType;
+import org.apache.hc.core5.util.Args;
 import org.apache.hc.core5.util.TimeValue;
 import org.apache.logging.log4j.Logger;
 
@@ -89,6 +90,7 @@ class ExecRuntimeImpl implements ExecRun
 
     @Override
     public void acquireConnection(final HttpRoute route, final Object object, final HttpClientContext context) throws IOException {
+        Args.notNull(route, "Route");
         if (endpointRef.get() == null) {
             final LeaseRequest connRequest = manager.lease(route, object);
             state = object;
@@ -104,9 +106,7 @@ class ExecRuntimeImpl implements ExecRun
                 final TimeValue timeout = requestConfig.getConnectionRequestTimeout();
                 final ConnectionEndpoint connectionEndpoint = connRequest.get(timeout.getDuration(), timeout.getTimeUnit());
                 endpointRef.set(connectionEndpoint);
-                if (!connectionEndpoint.isConnected()) {
-                    reusable = false;
-                }
+                reusable = connectionEndpoint.isConnected();
                 if (cancellableAware != null) {
                     cancellableAware.setCancellable(this);
                 }
@@ -165,6 +165,7 @@ class ExecRuntimeImpl implements ExecRun
         final ConnectionEndpoint endpoint = endpointRef.get();
         if (endpoint != null) {
             endpoint.close();
+            log.debug("Disconnected");
         }
     }
 

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/nio/AsyncClientConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/nio/AsyncClientConnectionManager.java?rev=1793320&r1=1793319&r2=1793320&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/nio/AsyncClientConnectionManager.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/nio/AsyncClientConnectionManager.java Mon May  1 12:39:16 2017
@@ -60,7 +60,7 @@ public interface AsyncClientConnectionMa
      * {@link AsyncConnectionEndpoint#isConnected() disconnected}. The consumer
      * of the endpoint is responsible for fully establishing the route to
      * the endpoint target by calling {@link #connect(AsyncConnectionEndpoint,
-     * ConnectionInitiator, TimeValue, HttpContext, FutureCallback)}
+     * ConnectionInitiator, TimeValue, Object, HttpContext, FutureCallback)}
      * in order to connect directly to the target or to the first proxy hop,
      * and optionally calling {@link #upgrade(AsyncConnectionEndpoint, HttpContext)}
      * method to upgrade the underlying transport to Transport Layer Security
@@ -100,12 +100,14 @@ public interface AsyncClientConnectionMa
      * @param endpoint      the managed endpoint.
      * @param connectTimeout connect timeout.
      * @param context the actual HTTP context.
+     * @param attachment connect request attachment.
      * @param callback result callback.
      */
     Future<AsyncConnectionEndpoint> connect(
             AsyncConnectionEndpoint endpoint,
             ConnectionInitiator connectionInitiator,
             TimeValue connectTimeout,
+            Object attachment,
             HttpContext context,
             FutureCallback<AsyncConnectionEndpoint> callback);
 

Modified: httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/H2TlsStrategy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/H2TlsStrategy.java?rev=1793320&r1=1793319&r2=1793320&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/H2TlsStrategy.java (original)
+++ httpcomponents/httpclient/trunk/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/H2TlsStrategy.java Mon May  1 12:39:16 2017
@@ -131,7 +131,7 @@ public class H2TlsStrategy implements Tl
             final SocketAddress localAddress,
             final SocketAddress remoteAddress,
             final Object attachment) {
-        tlsSession.startTls(sslContext, sslBufferManagement, H2TlsSupport.enforceRequirements(null, new SSLSessionInitializer() {
+        tlsSession.startTls(sslContext, sslBufferManagement, H2TlsSupport.enforceRequirements(attachment, new SSLSessionInitializer() {
 
             @Override
             public void initialize(final NamedEndpoint endpoint, final SSLEngine sslEngine) {