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 2026/09/29 19:01:34 UTC

(httpcomponents-core) 03/03: Added #isIdle method to async HTTP/1.1 and HTTP/2 protocol handlers to test if there are ongoing messages exchanges or the handlers can be considered idle

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

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

commit c0363887e166e7ba959a929dafa2d875f29eb117
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Tue Sep 29 15:52:40 2026 +0200

    Added #isIdle method to async HTTP/1.1 and HTTP/2 protocol handlers to test if there are ongoing messages exchanges or the handlers can be considered idle
---
 .../hc/core5/http2/impl/nio/AbstractH2IOEventHandler.java     |  5 +++++
 .../hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java  | 11 +++++++++--
 .../java/org/apache/hc/core5/http2/impl/nio/H2Streams.java    |  4 ++++
 .../hc/core5/http/impl/nio/AbstractHttp1IOEventHandler.java   |  5 +++++
 .../hc/core5/http/impl/nio/HttpConnectionEventHandler.java    |  8 ++++++++
 5 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2IOEventHandler.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2IOEventHandler.java
index 9dcd38e39..d97c08428 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2IOEventHandler.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2IOEventHandler.java
@@ -86,6 +86,11 @@ public void timeout(final IOSession session, final Timeout timeout) throws IOExc
         }
     }
 
+    @Override
+    public boolean isIdle() {
+        return streamMultiplexer.streamCount() > 0;
+    }
+
     @Override
     public void exception(final IOSession session, final Exception cause) {
         streamMultiplexer.onException(cause);
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java
index dadbf2799..53d200c29 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java
@@ -37,8 +37,8 @@
 import java.util.List;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedDeque;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
 
@@ -1381,6 +1381,13 @@ private void applyLocalSettings() throws H2ConnectionException {
         lowMark = initInputWinSize / 2;
     }
 
+    /**
+     * @since 5.5
+     */
+    public int streamCount() {
+        return streams.getCount();
+    }
+
     @Override
     public void close() throws IOException {
         ioSession.enqueue(ShutdownCommand.GRACEFUL, Command.Priority.IMMEDIATE);
@@ -1444,7 +1451,7 @@ void appendState(final StringBuilder buf) {
                 .append(", connInputWindow=").append(connInputWindow)
                 .append(", connOutputWindow=").append(connOutputWindow)
                 .append(", outputQueue=").append(outputQueue.size())
-                .append(", streams.localCoubt=").append(streams.getLocalCount())
+                .append(", streams.localCount=").append(streams.getLocalCount())
                 .append(", streams.remoteCount=").append(streams.getRemoteCount())
                 .append(", streams.lastLocal=").append(streams.getLastLocalId())
                 .append(", streams.lastRemote=").append(streams.getLastRemoteId());
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2Streams.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2Streams.java
index 4882295cc..09847a7d0 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2Streams.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/H2Streams.java
@@ -66,6 +66,10 @@ public boolean isEmpty() {
         return streams.isEmpty();
     }
 
+    public int getCount() {
+        return streams.size();
+    }
+
     public Iterator<H2Stream> iterator() {
         return streams.iterator();
     }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/AbstractHttp1IOEventHandler.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/AbstractHttp1IOEventHandler.java
index 8f89d8020..c3a3c40e0 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/AbstractHttp1IOEventHandler.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/AbstractHttp1IOEventHandler.java
@@ -85,6 +85,11 @@ public void timeout(final IOSession session, final Timeout timeout) throws IOExc
         }
     }
 
+    @Override
+    public boolean isIdle() {
+        return streamDuplexer.inputIdle() && streamDuplexer.outputIdle();
+    }
+
     @Override
     public void exception(final IOSession session, final Exception cause) {
         streamDuplexer.onException(cause);
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/HttpConnectionEventHandler.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/HttpConnectionEventHandler.java
index e378781e0..0eb7c8bd8 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/HttpConnectionEventHandler.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/nio/HttpConnectionEventHandler.java
@@ -37,4 +37,12 @@
  */
 @Internal
 public interface HttpConnectionEventHandler extends IOEventHandler, HttpConnection {
+
+    /**
+     * @since 5.5
+     */
+    default boolean isIdle() {
+        return false;
+    }
+
 }