HTTPCORE-672: H2ConnPool incorrectly handles validation of closed sessions
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 6eac4d0..b1581e9 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
@@ -140,20 +140,24 @@
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(result -> {
- ioSession.setSocketTimeout(socketTimeoutMillis);
- callback.execute(result);
- })), Command.Priority.NORMAL);
- return;
+ 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(result -> {
+ ioSession.setSocketTimeout(socketTimeoutMillis);
+ callback.execute(result);
+ })), 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 @@
commandQueue.add(command);
}
setEvent(SelectionKey.OP_WRITE);
+
+ if (isStatusClosed()) {
+ command.cancel();
+ }
}
@Override