You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kw...@apache.org on 2026/08/08 15:01:51 UTC

(maven-resolver) branch master updated: Consider "Retry-After" header in Java HTTP Client (#2044)

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

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git


The following commit(s) were added to refs/heads/master by this push:
     new bd2f8c66c Consider "Retry-After" header in Java HTTP Client (#2044)
bd2f8c66c is described below

commit bd2f8c66cced9c2d1e903b4cb9b7f39beef63f10
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Sat Aug 8 17:01:46 2026 +0200

    Consider "Retry-After" header in Java HTTP Client (#2044)
    
    Add test
---
 .../aether/internal/test/util/http/HttpServer.java   | 11 +++++++++++
 .../internal/test/util/http/HttpTransporterTest.java | 20 ++++++++++++++++++++
 .../eclipse/aether/transport/jdk/JdkTransporter.java |  4 ++--
 .../aether/transport/jetty/JettyTransporterTest.java |  5 +++++
 .../aether/transport/url/UrlTransporterTest.java     |  5 +++++
 5 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java
index c1185782d..a114a256a 100644
--- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java
+++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java
@@ -199,6 +199,8 @@ public class HttpServer {
 
     private String responseBodyForPut;
 
+    private Map<String, String> serverErrorHeaders = Collections.emptyMap();
+
     public String getHost() {
         return "localhost";
     }
@@ -413,8 +415,14 @@ public class HttpServer {
     }
 
     public HttpServer setServerErrorsBeforeWorks(int serverErrorsBeforeWorks, int errorStatusCode) {
+        return setServerErrorsBeforeWorks(serverErrorsBeforeWorks, errorStatusCode, Collections.emptyMap());
+    }
+
+    public HttpServer setServerErrorsBeforeWorks(
+            int serverErrorsBeforeWorks, int errorStatusCode, Map<String, String> headers) {
         this.serverErrorsBeforeWorks.set(serverErrorsBeforeWorks);
         this.serverErrorStatusCode = errorStatusCode;
+        this.serverErrorHeaders = headers;
         return this;
     }
 
@@ -592,6 +600,9 @@ public class HttpServer {
         public boolean handle(Request request, Response response, Callback callback) throws IOException {
             if (serverErrorsBeforeWorks.getAndDecrement() > 0) {
                 response.setStatus(serverErrorStatusCode);
+                for (Map.Entry<String, String> header : serverErrorHeaders.entrySet()) {
+                    response.getHeaders().add(header.getKey(), header.getValue());
+                }
                 writeResponseBodyMessage(request, response, "Oops, come back later!");
                 return true;
             }
diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java
index 312397689..633d3459f 100644
--- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java
+++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java
@@ -36,6 +36,7 @@ import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
 import java.security.KeyStore;
 import java.security.NoSuchAlgorithmException;
+import java.time.Duration;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
@@ -409,6 +410,25 @@ public abstract class HttpTransporterTest {
                 "Expected back off delay of at least " + retryIntervalMs);
     }
 
+    @Test
+    protected void testRetryHandler_tooManyRequests_withRetryAfterHeader_explicitCount_positive() throws Exception {
+        // set low retry count as this involves back off delays
+        session.setConfigProperty(ConfigurationProperties.HTTP_RETRY_HANDLER_COUNT, 1);
+        int retryIntervalMs = 5000;
+        session.setConfigProperty(ConfigurationProperties.HTTP_RETRY_HANDLER_INTERVAL, retryIntervalMs);
+        newTransporter(httpServer.getHttpUrl());
+        Duration retryAfterDuration = Duration.ofSeconds(1);
+        httpServer.setServerErrorsBeforeWorks(
+                1, SC_TOO_MANY_REQUESTS, Map.of("Retry-After", String.valueOf(retryAfterDuration.getSeconds())));
+        long startTime = System.currentTimeMillis();
+        transporter.peek(new PeekTask(URI.create("repo/file.txt")));
+        long elapsedTimeMs = System.currentTimeMillis() - startTime;
+        assertTrue(
+                elapsedTimeMs >= retryAfterDuration.toMillis(),
+                "Expected back off delay of at least " + retryAfterDuration.toMillis() + " ms");
+        assertTrue(elapsedTimeMs < retryIntervalMs, "Expected back off delay of less than " + retryIntervalMs + " ms");
+    }
+
     @Test
     protected void testRetryHandler_tooManyRequests_explicitCount_negative() throws Exception {
         // set low retry count as this involves back off delays
diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java
index f6d52a368..49203ef49 100644
--- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java
+++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java
@@ -705,8 +705,8 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte
                     .maxRetries(retryCount)
                     .onStatus(HttpTransporterUtils.getHttpServiceUnavailableCodes(session, repository)::contains)
                     .listener(new RetryLoggingListener(retryCount))
-                    .backoff(RetryInterceptor.BackoffStrategy.linear(
-                            Duration.ofMillis(retryInterval), Duration.ofMillis(retryIntervalMax)))
+                    .backoff(RetryInterceptor.BackoffStrategy.retryAfterOr(RetryInterceptor.BackoffStrategy.linear(
+                            Duration.ofMillis(retryInterval), Duration.ofMillis(retryIntervalMax))))
                     .build();
             builder.interceptor(rateLimitingRetryInterceptor);
             Methanol.Interceptor retryIoExceptionsInterceptor = RetryInterceptor.newBuilder()
diff --git a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java
index fd2318f4e..ab0f3fab3 100644
--- a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java
+++ b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java
@@ -66,6 +66,11 @@ class JettyTransporterTest extends HttpTransporterTest {
     @Test
     protected void testRetryHandler_tooManyRequests_explicitCount_positive() {}
 
+    @Override
+    @Disabled
+    @Test
+    protected void testRetryHandler_tooManyRequests_withRetryAfterHeader_explicitCount_positive() {}
+
     @Override
     @Disabled
     @Test
diff --git a/maven-resolver-transport-url/src/test/java/org/eclipse/aether/transport/url/UrlTransporterTest.java b/maven-resolver-transport-url/src/test/java/org/eclipse/aether/transport/url/UrlTransporterTest.java
index 9ad82d26e..97b09933e 100644
--- a/maven-resolver-transport-url/src/test/java/org/eclipse/aether/transport/url/UrlTransporterTest.java
+++ b/maven-resolver-transport-url/src/test/java/org/eclipse/aether/transport/url/UrlTransporterTest.java
@@ -234,4 +234,9 @@ class UrlTransporterTest extends HttpTransporterTest {
     @Disabled
     @Test
     protected void testRetryHandler_tooManyRequests_explicitCount_positive() {}
+
+    @Override
+    @Disabled
+    @Test
+    protected void testRetryHandler_tooManyRequests_withRetryAfterHeader_explicitCount_positive() {}
 }