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 2021/04/02 18:29:50 UTC

[httpcomponents-core] branch 5.1.x updated: HTTPCORE-672: H2ConnPool incorrectly handles validation of closed sessions

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

olegk pushed a commit to branch 5.1.x
in repository https://gitbox.apache.org/repos/asf/httpcomponents-core.git


The following commit(s) were added to refs/heads/5.1.x by this push:
     new 50c7acf  HTTPCORE-672: H2ConnPool incorrectly handles validation of closed sessions
50c7acf is described below

commit 50c7acf53d70d71057debcf062ae00a93cb533cb
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Fri Apr 2 12:55:16 2021 +0200

    HTTPCORE-672: H2ConnPool incorrectly handles validation of closed sessions
---
 .../apache/hc/core5/http2/nio/pool/H2ConnPool.java | 36 ++++++++++++----------
 .../org/apache/hc/core5/reactor/IOSessionImpl.java |  4 +++
 2 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/nio/pool/H2ConnPool.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/nio/pool/H2ConnPool.java
index 8b8f32b..08db232 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/nio/pool/H2ConnPool.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/nio/pool/H2ConnPool.java
@@ -133,25 +133,29 @@ public final class H2ConnPool extends AbstractIOSessionPool<HttpHost> {
     protected void validateSession(
             final IOSession ioSession,
             final Callback<Boolean> callback) {
-        final TimeValue timeValue = validateAfterInactivity;
-        if (TimeValue.isNonNegative(timeValue)) {
-            final long lastAccessTime = Math.min(ioSession.getLastReadTime(), ioSession.getLastWriteTime());
-            final long deadline = lastAccessTime + timeValue.toMilliseconds();
-            if (deadline <= System.currentTimeMillis()) {
-                final Timeout socketTimeoutMillis = ioSession.getSocketTimeout();
-                ioSession.enqueue(new PingCommand(new BasicPingHandler(new Callback<Boolean>() {
-
-                    @Override
-                    public void execute(final Boolean result) {
-                        ioSession.setSocketTimeout(socketTimeoutMillis);
-                        callback.execute(result);
-                    }
+        if (ioSession.isOpen()) {
+            final TimeValue timeValue = validateAfterInactivity;
+            if (TimeValue.isNonNegative(timeValue)) {
+                final long lastAccessTime = Math.min(ioSession.getLastReadTime(), ioSession.getLastWriteTime());
+                final long deadline = lastAccessTime + timeValue.toMilliseconds();
+                if (deadline <= System.currentTimeMillis()) {
+                    final Timeout socketTimeoutMillis = ioSession.getSocketTimeout();
+                    ioSession.enqueue(new PingCommand(new BasicPingHandler(new Callback<Boolean>() {
+
+                        @Override
+                        public void execute(final Boolean result) {
+                            ioSession.setSocketTimeout(socketTimeoutMillis);
+                            callback.execute(result);
+                        }
 
-                })), Command.Priority.NORMAL);
-                return;
+                    })), Command.Priority.NORMAL);
+                    return;
+                }
             }
+            callback.execute(true);
+        } else {
+            callback.execute(false);
         }
-        callback.execute(true);
     }
 
 }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/reactor/IOSessionImpl.java b/httpcore5/src/main/java/org/apache/hc/core5/reactor/IOSessionImpl.java
index f03a61a..c9439cb 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/reactor/IOSessionImpl.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/reactor/IOSessionImpl.java
@@ -108,6 +108,10 @@ class IOSessionImpl implements IOSession {
             commandQueue.add(command);
         }
         setEvent(SelectionKey.OP_WRITE);
+
+        if (isStatusClosed()) {
+            command.cancel();
+        }
     }
 
     @Override