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 2018/12/01 12:57:42 UTC

httpcomponents-core git commit: Moved start TLS logic from IOSession request callback to individual IOEventHandler factories

Repository: httpcomponents-core
Updated Branches:
  refs/heads/master b76b34e3c -> 5e88e5126


Moved start TLS logic from IOSession request callback to individual IOEventHandler factories


Project: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/commit/5e88e512
Tree: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/tree/5e88e512
Diff: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/diff/5e88e512

Branch: refs/heads/master
Commit: 5e88e51263ade7bc516d6089560927bc1099f930
Parents: b76b34e
Author: Oleg Kalnichevski <ol...@apache.org>
Authored: Sat Dec 1 13:57:29 2018 +0100
Committer: Oleg Kalnichevski <ol...@apache.org>
Committed: Sat Dec 1 13:57:29 2018 +0100

----------------------------------------------------------------------
 .../ClientHttpProtocolNegotiatorFactory.java    | 19 ++++++++++++++++++-
 .../nio/bootstrap/H2RequesterBootstrap.java     |  6 +++---
 .../impl/nio/bootstrap/Http2AsyncRequester.java |  6 ++----
 .../impl/bootstrap/AsyncRequesterBootstrap.java |  7 ++++---
 .../http/impl/bootstrap/HttpAsyncRequester.java | 18 +-----------------
 .../nio/ClientHttp1IOEventHandlerFactory.java   | 20 +++++++++++++++++++-
 .../hc/core5/reactor/InternalDataChannel.java   |  6 +++++-
 .../hc/core5/reactor/ProtocolIOSession.java     |  5 ++++-
 8 files changed, 56 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/5e88e512/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientHttpProtocolNegotiatorFactory.java
----------------------------------------------------------------------
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientHttpProtocolNegotiatorFactory.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientHttpProtocolNegotiatorFactory.java
index 985b675..90b5ddb 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientHttpProtocolNegotiatorFactory.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/ClientHttpProtocolNegotiatorFactory.java
@@ -30,7 +30,10 @@ package org.apache.hc.core5.http2.impl.nio;
 import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.Internal;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.impl.nio.ClientHttp1StreamDuplexerFactory;
+import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
 import org.apache.hc.core5.http2.HttpVersionPolicy;
 import org.apache.hc.core5.reactor.IOEventHandlerFactory;
 import org.apache.hc.core5.reactor.ProtocolIOSession;
@@ -48,18 +51,32 @@ public class ClientHttpProtocolNegotiatorFactory implements IOEventHandlerFactor
     private final ClientHttp1StreamDuplexerFactory http1StreamHandlerFactory;
     private final ClientHttp2StreamMultiplexerFactory http2StreamHandlerFactory;
     private final HttpVersionPolicy versionPolicy;
+    private final TlsStrategy tlsStrategy;
 
     public ClientHttpProtocolNegotiatorFactory(
             final ClientHttp1StreamDuplexerFactory http1StreamHandlerFactory,
             final ClientHttp2StreamMultiplexerFactory http2StreamHandlerFactory,
-            final HttpVersionPolicy versionPolicy) {
+            final HttpVersionPolicy versionPolicy,
+            final TlsStrategy tlsStrategy) {
         this.http1StreamHandlerFactory = Args.notNull(http1StreamHandlerFactory, "HTTP/1.1 stream handler factory");
         this.http2StreamHandlerFactory = Args.notNull(http2StreamHandlerFactory, "HTTP/2 stream handler factory");
         this.versionPolicy = versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE;
+        this.tlsStrategy = tlsStrategy;
     }
 
     @Override
     public ClientHttpProtocolNegotiator createHandler(final ProtocolIOSession ioSession, final Object attachment) {
+        if (tlsStrategy != null && ioSession.getInitialEndpoint() instanceof HttpHost) {
+            final HttpHost host = (HttpHost) ioSession.getInitialEndpoint();
+            if (URIScheme.HTTPS.same(host.getSchemeName())) {
+                tlsStrategy.upgrade(
+                        ioSession,
+                        host,
+                        ioSession.getLocalAddress(),
+                        ioSession.getRemoteAddress(),
+                        attachment);
+            }
+        }
         return new ClientHttpProtocolNegotiator(
                 ioSession,
                 http1StreamHandlerFactory,

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/5e88e512/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
----------------------------------------------------------------------
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
index f2619e1..ec6ca07 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
@@ -303,15 +303,15 @@ public class H2RequesterBootstrap {
         final IOEventHandlerFactory ioEventHandlerFactory = new ClientHttpProtocolNegotiatorFactory(
                 http1StreamHandlerFactory,
                 http2StreamHandlerFactory,
-                versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE);
+                versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE,
+                tlsStrategy != null ? tlsStrategy : new H2ClientTlsStrategy());
         return new Http2AsyncRequester(
                 versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE,
                 ioReactorConfig,
                 ioEventHandlerFactory,
                 ioSessionDecorator,
                 sessionListener,
-                connPool,
-                tlsStrategy != null ? tlsStrategy : new H2ClientTlsStrategy());
+                connPool);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/5e88e512/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/Http2AsyncRequester.java
----------------------------------------------------------------------
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/Http2AsyncRequester.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/Http2AsyncRequester.java
index d64e464..06c167a 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/Http2AsyncRequester.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/Http2AsyncRequester.java
@@ -35,7 +35,6 @@ import org.apache.hc.core5.function.Decorator;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.impl.bootstrap.HttpAsyncRequester;
 import org.apache.hc.core5.http.nio.AsyncClientEndpoint;
-import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
 import org.apache.hc.core5.http2.HttpVersionPolicy;
 import org.apache.hc.core5.pool.ManagedConnPool;
 import org.apache.hc.core5.reactor.IOEventHandlerFactory;
@@ -64,9 +63,8 @@ public class Http2AsyncRequester extends HttpAsyncRequester {
             final IOEventHandlerFactory eventHandlerFactory,
             final Decorator<IOSession> ioSessionDecorator,
             final IOSessionListener sessionListener,
-            final ManagedConnPool<HttpHost, IOSession> connPool,
-            final TlsStrategy tlsStrategy) {
-        super(ioReactorConfig, eventHandlerFactory, ioSessionDecorator, sessionListener, connPool, tlsStrategy);
+            final ManagedConnPool<HttpHost, IOSession> connPool) {
+        super(ioReactorConfig, eventHandlerFactory, ioSessionDecorator, sessionListener, connPool);
         this.versionPolicy = versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE;
     }
 

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/5e88e512/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
index 8f154e3..ae37de0 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
@@ -221,14 +221,15 @@ public class AsyncRequesterBootstrap {
                 null,
                 null,
                 streamListener);
-        final IOEventHandlerFactory ioEventHandlerFactory = new ClientHttp1IOEventHandlerFactory(streamDuplexerFactory);
+        final IOEventHandlerFactory ioEventHandlerFactory = new ClientHttp1IOEventHandlerFactory(
+                streamDuplexerFactory,
+                tlsStrategy != null ? tlsStrategy : new BasicClientTlsStrategy());
         return new HttpAsyncRequester(
                 ioReactorConfig,
                 ioEventHandlerFactory,
                 ioSessionDecorator,
                 sessionListener,
-                connPool,
-                tlsStrategy != null ? tlsStrategy : new BasicClientTlsStrategy());
+                connPool);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/5e88e512/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
index ee4e675..13dafe5 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
@@ -46,7 +46,6 @@ import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.HttpResponse;
 import org.apache.hc.core5.http.ProtocolException;
-import org.apache.hc.core5.http.URIScheme;
 import org.apache.hc.core5.http.impl.DefaultAddressResolver;
 import org.apache.hc.core5.http.nio.AsyncClientEndpoint;
 import org.apache.hc.core5.http.nio.AsyncClientExchangeHandler;
@@ -59,7 +58,6 @@ import org.apache.hc.core5.http.nio.HandlerFactory;
 import org.apache.hc.core5.http.nio.RequestChannel;
 import org.apache.hc.core5.http.nio.command.RequestExecutionCommand;
 import org.apache.hc.core5.http.nio.command.ShutdownCommand;
-import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
 import org.apache.hc.core5.http.nio.support.BasicClientExchangeHandler;
 import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
@@ -74,7 +72,6 @@ import org.apache.hc.core5.reactor.IOEventHandlerFactory;
 import org.apache.hc.core5.reactor.IOReactorConfig;
 import org.apache.hc.core5.reactor.IOSession;
 import org.apache.hc.core5.reactor.IOSessionListener;
-import org.apache.hc.core5.reactor.ssl.TransportSecurityLayer;
 import org.apache.hc.core5.util.Args;
 import org.apache.hc.core5.util.TimeValue;
 import org.apache.hc.core5.util.Timeout;
@@ -87,7 +84,6 @@ import org.apache.hc.core5.util.Timeout;
 public class HttpAsyncRequester extends AsyncRequester implements ConnPoolControl<HttpHost> {
 
     private final ManagedConnPool<HttpHost, IOSession> connPool;
-    private final TlsStrategy tlsStrategy;
 
     /**
      * Use {@link AsyncRequesterBootstrap} to create instances of this class.
@@ -98,12 +94,10 @@ public class HttpAsyncRequester extends AsyncRequester implements ConnPoolContro
             final IOEventHandlerFactory eventHandlerFactory,
             final Decorator<IOSession> ioSessionDecorator,
             final IOSessionListener sessionListener,
-            final ManagedConnPool<HttpHost, IOSession> connPool,
-            final TlsStrategy tlsStrategy) {
+            final ManagedConnPool<HttpHost, IOSession> connPool) {
         super(eventHandlerFactory, ioReactorConfig, ioSessionDecorator, sessionListener,
                         ShutdownCommand.GRACEFUL_IMMEDIATE_CALLBACK, DefaultAddressResolver.INSTANCE);
         this.connPool = Args.notNull(connPool, "Connection pool");
-        this.tlsStrategy = tlsStrategy;
     }
 
     @Override
@@ -194,16 +188,6 @@ public class HttpAsyncRequester extends AsyncRequester implements ConnPoolContro
 
                         @Override
                         public void completed(final IOSession session) {
-                            if (tlsStrategy != null
-                                    && URIScheme.HTTPS.same(host.getSchemeName())
-                                    && session instanceof TransportSecurityLayer) {
-                                tlsStrategy.upgrade(
-                                        (TransportSecurityLayer) session,
-                                        host,
-                                        session.getLocalAddress(),
-                                        session.getRemoteAddress(),
-                                        attachment);
-                            }
                             session.setSocketTimeout(timeout);
                             poolEntry.assignConnection(session);
                             resultFuture.completed(endpoint);

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/5e88e512/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/ClientHttp1IOEventHandlerFactory.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/ClientHttp1IOEventHandlerFactory.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/ClientHttp1IOEventHandlerFactory.java
index 5055a95..c787f21 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/ClientHttp1IOEventHandlerFactory.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/ClientHttp1IOEventHandlerFactory.java
@@ -29,6 +29,9 @@ package org.apache.hc.core5.http.impl.nio;
 
 import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.URIScheme;
+import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
 import org.apache.hc.core5.reactor.IOEventHandler;
 import org.apache.hc.core5.reactor.IOEventHandlerFactory;
 import org.apache.hc.core5.reactor.ProtocolIOSession;
@@ -43,13 +46,28 @@ import org.apache.hc.core5.util.Args;
 public class ClientHttp1IOEventHandlerFactory implements IOEventHandlerFactory {
 
     private final ClientHttp1StreamDuplexerFactory streamDuplexerFactory;
+    private final TlsStrategy tlsStrategy;
 
-    public ClientHttp1IOEventHandlerFactory(final ClientHttp1StreamDuplexerFactory streamDuplexerFactory) {
+    public ClientHttp1IOEventHandlerFactory(
+            final ClientHttp1StreamDuplexerFactory streamDuplexerFactory,
+            final TlsStrategy tlsStrategy) {
         this.streamDuplexerFactory = Args.notNull(streamDuplexerFactory, "Stream duplexer factory");
+        this.tlsStrategy = tlsStrategy;
     }
 
     @Override
     public IOEventHandler createHandler(final ProtocolIOSession ioSession, final Object attachment) {
+        if (tlsStrategy != null && ioSession.getInitialEndpoint() instanceof HttpHost) {
+            final HttpHost host = (HttpHost) ioSession.getInitialEndpoint();
+            if (URIScheme.HTTPS.same(host.getSchemeName())) {
+                tlsStrategy.upgrade(
+                        ioSession,
+                        host,
+                        ioSession.getLocalAddress(),
+                        ioSession.getRemoteAddress(),
+                        attachment);
+            }
+        }
         return new ClientHttp1IOEventHandler(streamDuplexerFactory.create(ioSession));
     }
 

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/5e88e512/httpcore5/src/main/java/org/apache/hc/core5/reactor/InternalDataChannel.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/reactor/InternalDataChannel.java b/httpcore5/src/main/java/org/apache/hc/core5/reactor/InternalDataChannel.java
index 3678451..48cf90b 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/reactor/InternalDataChannel.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/reactor/InternalDataChannel.java
@@ -81,13 +81,17 @@ final class InternalDataChannel extends InternalChannel implements ProtocolIOSes
         return ioSession.getId();
     }
 
-
     @Override
     public IOEventHandler getHandler() {
         return handlerRef.get();
     }
 
     @Override
+    public NamedEndpoint getInitialEndpoint() {
+        return initialEndpoint;
+    }
+
+    @Override
     public void upgrade(final IOEventHandler handler) {
         handlerRef.set(handler);
     }

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/5e88e512/httpcore5/src/main/java/org/apache/hc/core5/reactor/ProtocolIOSession.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/reactor/ProtocolIOSession.java b/httpcore5/src/main/java/org/apache/hc/core5/reactor/ProtocolIOSession.java
index b1f32cf..2f561d5 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/reactor/ProtocolIOSession.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/reactor/ProtocolIOSession.java
@@ -27,6 +27,7 @@
 
 package org.apache.hc.core5.reactor;
 
+import org.apache.hc.core5.net.NamedEndpoint;
 import org.apache.hc.core5.reactor.ssl.TransportSecurityLayer;
 
 /**
@@ -35,5 +36,7 @@ import org.apache.hc.core5.reactor.ssl.TransportSecurityLayer;
  * @since 5.0
  */
 public interface ProtocolIOSession extends IOSession, ProtocolLayer, TransportSecurityLayer {
-    // empty
+
+    NamedEndpoint getInitialEndpoint();
+
 }