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 2020/04/18 10:08:44 UTC

[httpcomponents-client] branch HTTPASYNC-160 created (now 3a0b506)

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a change to branch HTTPASYNC-160
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git.


      at 3a0b506  HTTPASYNC-160: HttpAsyncClient in INACTIVE or STOPPED state throws a IllegalStateException causing the current thread to terminate

This branch includes the following new commits:

     new 3a0b506  HTTPASYNC-160: HttpAsyncClient in INACTIVE or STOPPED state throws a IllegalStateException causing the current thread to terminate

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[httpcomponents-client] 01/01: HTTPASYNC-160: HttpAsyncClient in INACTIVE or STOPPED state throws a IllegalStateException causing the current thread to terminate

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch HTTPASYNC-160
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git

commit 3a0b506151566da25cf676cd79857365ae23c98d
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Sat Apr 18 12:08:10 2020 +0200

    HTTPASYNC-160: HttpAsyncClient in INACTIVE or STOPPED state throws a IllegalStateException causing the current thread to terminate
---
 .../http/impl/async/AbstractHttpAsyncClientBase.java     |  9 ++-------
 .../http/impl/async/InternalAbstractHttpAsyncClient.java |  7 +++++--
 .../hc/client5/http/impl/async/MinimalH2AsyncClient.java |  9 ++++++---
 .../client5/http/impl/async/MinimalHttpAsyncClient.java  | 16 +++++++++++-----
 4 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AbstractHttpAsyncClientBase.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AbstractHttpAsyncClientBase.java
index eb92d14..3ab0947 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AbstractHttpAsyncClientBase.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AbstractHttpAsyncClientBase.java
@@ -81,13 +81,8 @@ abstract class AbstractHttpAsyncClientBase extends CloseableHttpAsyncClient {
         pushConsumerRegistry.register(hostname, uriPattern, supplier);
     }
 
-    void ensureRunning() {
-        switch (status.get()) {
-            case READY:
-                throw new IllegalStateException("Client is not running");
-            case TERMINATED:
-                throw new IllegalStateException("Client has been terminated");
-        }
+    boolean isRunning() {
+        return status.get() == Status.RUNNING;
     }
 
     ConnectionInitiator getConnectionInitiator() {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalAbstractHttpAsyncClient.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalAbstractHttpAsyncClient.java
index e16a1a4..c010523 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalAbstractHttpAsyncClient.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/InternalAbstractHttpAsyncClient.java
@@ -30,6 +30,7 @@ import java.io.Closeable;
 import java.io.IOException;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.CancellationException;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadFactory;
@@ -150,9 +151,11 @@ abstract class InternalAbstractHttpAsyncClient extends AbstractHttpAsyncClientBa
             final HandlerFactory<AsyncPushConsumer> pushHandlerFactory,
             final HttpContext context,
             final FutureCallback<T> callback) {
-        ensureRunning();
         final ComplexFuture<T> future = new ComplexFuture<>(callback);
         try {
+            if (!isRunning()) {
+                throw new CancellationException("Request execution cancelled");
+            }
             final HttpClientContext clientContext = context != null ? HttpClientContext.adapt(context) : HttpClientContext.create();
             requestProducer.sendRequest(new RequestChannel() {
 
@@ -316,7 +319,7 @@ abstract class InternalAbstractHttpAsyncClient extends AbstractHttpAsyncClientBa
                 }
 
             }, context);
-        } catch (final HttpException | IOException ex) {
+        } catch (final HttpException | IOException | IllegalStateException ex) {
             future.failed(ex);
         }
         return future;
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalH2AsyncClient.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalH2AsyncClient.java
index dc23b62..411fb85 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalH2AsyncClient.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalH2AsyncClient.java
@@ -30,6 +30,7 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
 import java.util.List;
+import java.util.concurrent.CancellationException;
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadFactory;
 
@@ -134,10 +135,12 @@ public final class MinimalH2AsyncClient extends AbstractMinimalHttpAsyncClientBa
             final AsyncClientExchangeHandler exchangeHandler,
             final HandlerFactory<AsyncPushConsumer> pushHandlerFactory,
             final HttpContext context) {
-        ensureRunning();
         final ComplexCancellable cancellable = new ComplexCancellable();
-        final HttpClientContext clientContext = context != null ? HttpClientContext.adapt(context) : HttpClientContext.create();
         try {
+            if (!isRunning()) {
+                throw new CancellationException("Request execution cancelled");
+            }
+            final HttpClientContext clientContext = context != null ? HttpClientContext.adapt(context) : HttpClientContext.create();
             exchangeHandler.produceRequest(new RequestChannel() {
 
                 @Override
@@ -270,7 +273,7 @@ public final class MinimalH2AsyncClient extends AbstractMinimalHttpAsyncClientBa
                 }
 
             }, context);
-        } catch (final HttpException | IOException ex) {
+        } catch (final HttpException | IOException | IllegalStateException ex) {
             exchangeHandler.failed(ex);
         }
         return cancellable;
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttpAsyncClient.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttpAsyncClient.java
index d4e95d2..b3a340d 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttpAsyncClient.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/MinimalHttpAsyncClient.java
@@ -29,6 +29,7 @@ package org.apache.hc.client5.http.impl.async;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.List;
+import java.util.concurrent.CancellationException;
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -209,12 +210,15 @@ public final class MinimalHttpAsyncClient extends AbstractMinimalHttpAsyncClient
             final FutureCallback<AsyncClientEndpoint> callback) {
         Args.notNull(host, "Host");
         Args.notNull(context, "HTTP context");
-        ensureRunning();
+        final BasicFuture<AsyncClientEndpoint> future = new BasicFuture<>(callback);
+        if (!isRunning()) {
+            future.failed(new CancellationException("Connection lease cancelled"));
+            return future;
+        }
         final HttpClientContext clientContext = HttpClientContext.adapt(context);
         final RequestConfig requestConfig = clientContext.getRequestConfig();
         final Timeout connectionRequestTimeout = requestConfig.getConnectionRequestTimeout();
         final Timeout connectTimeout = requestConfig.getConnectTimeout();
-        final BasicFuture<AsyncClientEndpoint> future = new BasicFuture<>(callback);
         leaseEndpoint(
                 host,
                 connectionRequestTimeout,
@@ -246,10 +250,12 @@ public final class MinimalHttpAsyncClient extends AbstractMinimalHttpAsyncClient
             final AsyncClientExchangeHandler exchangeHandler,
             final HandlerFactory<AsyncPushConsumer> pushHandlerFactory,
             final HttpContext context) {
-        ensureRunning();
         final ComplexCancellable cancellable = new ComplexCancellable();
-        final HttpClientContext clientContext = context != null ? HttpClientContext.adapt(context) : HttpClientContext.create();
         try {
+            if (!isRunning()) {
+                throw new CancellationException("Request execution cancelled");
+            }
+            final HttpClientContext clientContext = context != null ? HttpClientContext.adapt(context) : HttpClientContext.create();
             exchangeHandler.produceRequest(new RequestChannel() {
 
                 @Override
@@ -426,7 +432,7 @@ public final class MinimalHttpAsyncClient extends AbstractMinimalHttpAsyncClient
                 }
             }, context);
 
-        } catch (final HttpException | IOException ex) {
+        } catch (final HttpException | IOException | IllegalStateException ex) {
             exchangeHandler.failed(ex);
         }
         return cancellable;