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/01/15 08:17:57 UTC

[3/4] httpcomponents-client git commit: HTTP/2 client implementations to support cancellation of ongoing message exchanges without terminating the underlying connections

HTTP/2 client implementations to support cancellation of ongoing message exchanges without terminating the underlying connections


Project: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/commit/10126c70
Tree: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/tree/10126c70
Diff: http://git-wip-us.apache.org/repos/asf/httpcomponents-client/diff/10126c70

Branch: refs/heads/master
Commit: 10126c70ffafc22a2ee5b5df1f8e341eb95546b6
Parents: 695f353
Author: Oleg Kalnichevski <ol...@apache.org>
Authored: Fri Jan 12 14:40:32 2018 +0100
Committer: Oleg Kalnichevski <ol...@apache.org>
Committed: Fri Jan 12 14:40:32 2018 +0100

----------------------------------------------------------------------
 .../apache/hc/client5/http/async/AsyncExecRuntime.java   |  2 +-
 .../http/impl/async/Http2AsyncMainClientExec.java        | 11 +++++------
 .../client5/http/impl/async/HttpAsyncMainClientExec.java |  9 +++++----
 .../http/impl/async/InternalHttp2AsyncExecRuntime.java   | 10 ++++++----
 .../http/impl/async/InternalHttpAsyncExecRuntime.java    |  4 ++--
 .../client5/http/impl/async/MinimalHttp2AsyncClient.java |  4 ++--
 6 files changed, 21 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/10126c70/httpclient5/src/main/java/org/apache/hc/client5/http/async/AsyncExecRuntime.java
----------------------------------------------------------------------
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/async/AsyncExecRuntime.java b/httpclient5/src/main/java/org/apache/hc/client5/http/async/AsyncExecRuntime.java
index 919457c..7c0b027 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/async/AsyncExecRuntime.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/async/AsyncExecRuntime.java
@@ -72,7 +72,7 @@ public interface AsyncExecRuntime {
     /**
      * Initiates a message exchange using the given handler.
      */
-    void execute(
+    Cancellable execute(
             AsyncClientExchangeHandler exchangeHandler,
             HttpClientContext context);
 

http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/10126c70/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/Http2AsyncMainClientExec.java
----------------------------------------------------------------------
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/Http2AsyncMainClientExec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/Http2AsyncMainClientExec.java
index 18c6892..802e405 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/Http2AsyncMainClientExec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/Http2AsyncMainClientExec.java
@@ -32,12 +32,12 @@ import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.apache.hc.client5.http.HttpRoute;
 import org.apache.hc.client5.http.async.AsyncExecCallback;
 import org.apache.hc.client5.http.async.AsyncExecChain;
 import org.apache.hc.client5.http.async.AsyncExecChainHandler;
 import org.apache.hc.client5.http.async.AsyncExecRuntime;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.concurrent.CancellableDependency;
 import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpException;
@@ -65,7 +65,7 @@ class Http2AsyncMainClientExec implements AsyncExecChainHandler {
             final AsyncExecChain chain,
             final AsyncExecCallback asyncExecCallback) throws HttpException, IOException {
         final String exchangeId = scope.exchangeId;
-        final HttpRoute route = scope.route;
+        final CancellableDependency operation = scope.cancellableDependency;
         final HttpClientContext clientContext = scope.clientContext;
         final AsyncExecRuntime execRuntime = scope.execRuntime;
 
@@ -158,12 +158,11 @@ class Http2AsyncMainClientExec implements AsyncExecChainHandler {
         };
 
         if (log.isDebugEnabled()) {
-            execRuntime.execute(
+            operation.setDependency(execRuntime.execute(
                     new LoggingAsyncClientExchangeHandler(log, exchangeId, internalExchangeHandler),
-                    clientContext);
+                    clientContext));
         } else {
-            execRuntime.execute(
-                    internalExchangeHandler, clientContext);
+            operation.setDependency(execRuntime.execute( internalExchangeHandler, clientContext));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/10126c70/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncMainClientExec.java
----------------------------------------------------------------------
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncMainClientExec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncMainClientExec.java
index 301382c..1c8eabd 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncMainClientExec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncMainClientExec.java
@@ -41,6 +41,7 @@ import org.apache.hc.client5.http.async.AsyncExecChain;
 import org.apache.hc.client5.http.async.AsyncExecChainHandler;
 import org.apache.hc.client5.http.async.AsyncExecRuntime;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.concurrent.CancellableDependency;
 import org.apache.hc.core5.http.EntityDetails;
 import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpException;
@@ -79,6 +80,7 @@ class HttpAsyncMainClientExec implements AsyncExecChainHandler {
             final AsyncExecCallback asyncExecCallback) throws HttpException, IOException {
         final String exchangeId = scope.exchangeId;
         final HttpRoute route = scope.route;
+        final CancellableDependency operation = scope.cancellableDependency;
         final HttpClientContext clientContext = scope.clientContext;
         final AsyncExecRuntime execRuntime = scope.execRuntime;
 
@@ -217,12 +219,11 @@ class HttpAsyncMainClientExec implements AsyncExecChainHandler {
         };
 
         if (log.isDebugEnabled()) {
-            execRuntime.execute(
+            operation.setDependency(execRuntime.execute(
                     new LoggingAsyncClientExchangeHandler(log, exchangeId, internalExchangeHandler),
-                    clientContext);
+                    clientContext));
         } else {
-            execRuntime.execute(
-                    internalExchangeHandler, clientContext);
+            operation.setDependency(execRuntime.execute(internalExchangeHandler, clientContext));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/10126c70/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttp2AsyncExecRuntime.java
----------------------------------------------------------------------
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttp2AsyncExecRuntime.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttp2AsyncExecRuntime.java
index be8ef7c..5708b39 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttp2AsyncExecRuntime.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttp2AsyncExecRuntime.java
@@ -37,6 +37,7 @@ import org.apache.hc.client5.http.impl.ConnPoolSupport;
 import org.apache.hc.client5.http.impl.Operations;
 import org.apache.hc.client5.http.protocol.HttpClientContext;
 import org.apache.hc.core5.concurrent.Cancellable;
+import org.apache.hc.core5.concurrent.ComplexCancellable;
 import org.apache.hc.core5.concurrent.FutureCallback;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.nio.AsyncClientExchangeHandler;
@@ -190,14 +191,15 @@ class InternalHttp2AsyncExecRuntime implements AsyncExecRuntime {
     }
 
     @Override
-    public void execute(final AsyncClientExchangeHandler exchangeHandler, final HttpClientContext context) {
+    public Cancellable execute(final AsyncClientExchangeHandler exchangeHandler, final HttpClientContext context) {
+        final ComplexCancellable complexCancellable = new ComplexCancellable();
         final Endpoint endpoint = ensureValid();
         final IOSession session = endpoint.session;
         if (!session.isClosed()) {
             if (log.isDebugEnabled()) {
                 log.debug(ConnPoolSupport.getId(endpoint) + ": executing " + ConnPoolSupport.getId(exchangeHandler));
             }
-            session.addLast(new ExecutionCommand(exchangeHandler, context));
+            session.addLast(new ExecutionCommand(exchangeHandler, complexCancellable, context));
         } else {
             final HttpHost target = endpoint.target;
             final RequestConfig requestConfig = context.getRequestConfig();
@@ -210,7 +212,7 @@ class InternalHttp2AsyncExecRuntime implements AsyncExecRuntime {
                     if (log.isDebugEnabled()) {
                         log.debug(ConnPoolSupport.getId(endpoint) + ": executing " + ConnPoolSupport.getId(exchangeHandler));
                     }
-                    session.addLast(new ExecutionCommand(exchangeHandler, context));
+                    session.addLast(new ExecutionCommand(exchangeHandler, complexCancellable, context));
                 }
 
                 @Override
@@ -225,7 +227,7 @@ class InternalHttp2AsyncExecRuntime implements AsyncExecRuntime {
 
             });
         }
-
+        return complexCancellable;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/10126c70/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttpAsyncExecRuntime.java
----------------------------------------------------------------------
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttpAsyncExecRuntime.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttpAsyncExecRuntime.java
index dc91be1..e48b8dd 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttpAsyncExecRuntime.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalHttpAsyncExecRuntime.java
@@ -230,7 +230,7 @@ class InternalHttpAsyncExecRuntime implements AsyncExecRuntime {
     }
 
     @Override
-    public void execute(final AsyncClientExchangeHandler exchangeHandler, final HttpClientContext context) {
+    public Cancellable execute(final AsyncClientExchangeHandler exchangeHandler, final HttpClientContext context) {
         final AsyncConnectionEndpoint endpoint = ensureValid();
         if (endpoint.isConnected()) {
             if (log.isDebugEnabled()) {
@@ -264,7 +264,7 @@ class InternalHttpAsyncExecRuntime implements AsyncExecRuntime {
 
             });
         }
-
+        return Operations.nonCancellable();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/httpcomponents-client/blob/10126c70/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttp2AsyncClient.java
----------------------------------------------------------------------
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttp2AsyncClient.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttp2AsyncClient.java
index 2ba4cbe..77be31b 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttp2AsyncClient.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttp2AsyncClient.java
@@ -214,9 +214,9 @@ public final class MinimalHttp2AsyncClient extends AbstractMinimalHttpAsyncClien
                                 log.debug(ConnPoolSupport.getId(session) + ": executing message exchange " + exchangeId);
                                 session.addLast(new ExecutionCommand(
                                         new LoggingAsyncClientExchangeHandler(log, exchangeId, internalExchangeHandler),
-                                        clientContext));
+                                        resultFuture, clientContext));
                             } else {
-                                session.addLast(new ExecutionCommand(internalExchangeHandler, clientContext));
+                                session.addLast(new ExecutionCommand(internalExchangeHandler, resultFuture, clientContext));
                             }
                         }