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() {}
}