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 2023/06/29 17:05:08 UTC

[httpcomponents-core] 01/01: HTTPCORE-754: StrictConnPool fails to correctly handle infinite request timeout

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

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

commit b7bcbe55e622fd76829c31b42f457a3e73c8bf78
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Thu Jun 29 19:01:10 2023 +0200

    HTTPCORE-754: StrictConnPool fails to correctly handle infinite request timeout
---
 .../main/java/org/apache/hc/core5/pool/StrictConnPool.java   |  6 +++++-
 .../src/main/java/org/apache/hc/core5/util/Deadline.java     | 12 ++++++++++--
 .../apache/hc/core5/util/TestDeadlineTimeoutException.java   |  7 +++++++
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java b/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java
index 9801cf82e..9fcccd761 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java
@@ -192,7 +192,11 @@ public class StrictConnPool<T, C extends ModalCloseable> implements ManagedConnP
         final boolean acquiredLock;
 
         try {
-            acquiredLock = this.lock.tryLock(requestTimeout.getDuration(), requestTimeout.getTimeUnit());
+            if (Timeout.isPositive(requestTimeout)) {
+                acquiredLock = this.lock.tryLock(requestTimeout.getDuration(), requestTimeout.getTimeUnit());
+            } else {
+                acquiredLock = this.lock.tryLock();
+            }
         } catch (final InterruptedException interruptedException) {
             Thread.currentThread().interrupt();
             future.cancel();
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/util/Deadline.java b/httpcore5/src/main/java/org/apache/hc/core5/util/Deadline.java
index 851a9a8a1..fb9861420 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/util/Deadline.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/util/Deadline.java
@@ -181,7 +181,11 @@ public class Deadline {
      * @return a formatted string.
      */
     public String format(final TimeUnit overdueTimeUnit) {
-        return String.format("Deadline: %s, %s overdue", formatTarget(), TimeValue.of(remaining(), overdueTimeUnit));
+        if (value == MAX_VALUE.value) {
+            return "No deadline (infinite)";
+        } else {
+            return String.format("Deadline: %s, %s overdue", formatTarget(), TimeValue.of(remaining(), overdueTimeUnit));
+        }
     }
 
     /**
@@ -190,7 +194,11 @@ public class Deadline {
      * @return a formatted string in the format {@value #DATE_FORMAT}.
      */
     public String formatTarget() {
-        return DATE_TIME_FORMATTER.format(Instant.ofEpochMilli(value).atOffset(ZoneOffset.UTC));
+        if (value == MAX_VALUE.value) {
+            return "(infinite)";
+        } else {
+            return DATE_TIME_FORMATTER.format(Instant.ofEpochMilli(value).atOffset(ZoneOffset.UTC));
+        }
     }
 
     public Deadline freeze() {
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/util/TestDeadlineTimeoutException.java b/httpcore5/src/test/java/org/apache/hc/core5/util/TestDeadlineTimeoutException.java
index 83f949ea2..401098b6a 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/util/TestDeadlineTimeoutException.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/util/TestDeadlineTimeoutException.java
@@ -42,4 +42,11 @@ public class TestDeadlineTimeoutException {
                 DeadlineTimeoutException.from(deadline).getMessage());
     }
 
+    @Test
+    public void testInfiniteDeadlineMessage() {
+        final Deadline deadline = Deadline.calculate(Timeout.ZERO_MILLISECONDS);
+        Assertions.assertEquals("No deadline (infinite)",
+                DeadlineTimeoutException.from(deadline).getMessage());
+    }
+
 }