4444import org .codehaus .plexus .logging .Logger ;
4545import org .codehaus .plexus .personality .plexus .lifecycle .phase .Initializable ;
4646import org .codehaus .plexus .personality .plexus .lifecycle .phase .InitializationException ;
47+ import org .eclipse .tycho .helper .MavenPropertyHelper ;
4748import org .eclipse .tycho .p2maven .helper .ProxyHelper ;
4849import org .eclipse .tycho .p2maven .transport .Response .ResponseConsumer ;
4950
@@ -67,7 +68,13 @@ public class Java11HttpTransportFactory implements HttpTransportFactory, Initial
6768 ThreadLocal .withInitial (() -> new SimpleDateFormat ("EEE MMMd HH:mm:ss yyyy" , Locale .ENGLISH )));
6869
6970 static final String HINT = "Java11Client" ;
70- private static final int MAX_RETRY_ATTEMPTS = 5 ;
71+
72+ // Maven Resolver compatible configuration properties
73+ private static final String PROP_RETRY_HANDLER_COUNT = "aether.connector.http.retryHandler.count" ;
74+ private static final String PROP_RETRY_HANDLER_INTERVAL = "aether.connector.http.retryHandler.interval" ;
75+
76+ // Default values aligned with Maven Resolver
77+ private static final int DEFAULT_MAX_RETRY_ATTEMPTS = 3 ;
7178 private static final int DEFAULT_RETRY_DELAY_SECONDS = 5 ;
7279
7380 @ Requirement
@@ -76,14 +83,19 @@ public class Java11HttpTransportFactory implements HttpTransportFactory, Initial
7683 MavenAuthenticator authenticator ;
7784 @ Requirement
7885 Logger logger ;
86+ @ Requirement
87+ MavenPropertyHelper propertyHelper ;
88+
89+ private int maxRetryAttempts ;
90+ private int retryDelaySeconds ;
7991
8092 private HttpClient client ;
8193 private HttpClient clientHttp1 ;
8294
8395 @ Override
8496 public HttpTransport createTransport (URI uri ) {
8597 Java11HttpTransport transport = new Java11HttpTransport (client , clientHttp1 , HttpRequest .newBuilder ().uri (uri ),
86- uri , logger );
98+ uri , logger , maxRetryAttempts , retryDelaySeconds );
8799 authenticator .preemtiveAuth ((k , v ) -> transport .setHeader (k , v ), uri );
88100 return transport ;
89101 }
@@ -95,13 +107,18 @@ private static final class Java11HttpTransport implements HttpTransport {
95107 private Logger logger ;
96108 private HttpClient clientHttp1 ;
97109 private URI uri ;
110+ private int maxRetryAttempts ;
111+ private int retryDelaySeconds ;
98112
99- public Java11HttpTransport (HttpClient client , HttpClient clientHttp1 , Builder builder , URI uri , Logger logger ) {
113+ public Java11HttpTransport (HttpClient client , HttpClient clientHttp1 , Builder builder , URI uri , Logger logger ,
114+ int maxRetryAttempts , int retryDelaySeconds ) {
100115 this .client = client ;
101116 this .clientHttp1 = clientHttp1 ;
102117 this .builder = builder ;
103118 this .uri = uri ;
104119 this .logger = logger ;
120+ this .maxRetryAttempts = maxRetryAttempts ;
121+ this .retryDelaySeconds = retryDelaySeconds ;
105122 }
106123
107124 @ Override
@@ -135,7 +152,7 @@ private boolean shouldRetry(int statusCode) {
135152 private long getRetryDelay (HttpResponse <?> response ) {
136153 String retryAfterHeader = response .headers ().firstValue ("Retry-After" ).orElse (null );
137154 if (retryAfterHeader == null || retryAfterHeader .isBlank ()) {
138- return DEFAULT_RETRY_DELAY_SECONDS ;
155+ return retryDelaySeconds ;
139156 }
140157
141158 // Try to parse as seconds (integer)
@@ -162,12 +179,12 @@ private long getRetryDelay(HttpResponse<?> response) {
162179 }
163180
164181 // Default if parsing fails
165- return DEFAULT_RETRY_DELAY_SECONDS ;
182+ return retryDelaySeconds ;
166183 }
167184
168185 private <T > T performGet (ResponseConsumer <T > consumer , HttpClient httpClient )
169186 throws IOException , InterruptedException {
170- int retriesLeft = MAX_RETRY_ATTEMPTS ;
187+ int retriesLeft = maxRetryAttempts ;
171188 while (retriesLeft > 0 ) {
172189 retriesLeft --;
173190 HttpRequest request = builder .GET ().timeout (Duration .ofSeconds (TIMEOUT_SECONDS )).build ();
@@ -249,7 +266,7 @@ public Response head() throws IOException {
249266 }
250267
251268 private Response doHead (HttpClient httpClient ) throws IOException , InterruptedException {
252- int retriesLeft = MAX_RETRY_ATTEMPTS ;
269+ int retriesLeft = maxRetryAttempts ;
253270 while (retriesLeft > 0 ) {
254271 retriesLeft --;
255272 HttpResponse <Void > response = httpClient .send (
@@ -336,6 +353,21 @@ public long getLastModified() {
336353
337354 @ Override
338355 public void initialize () throws InitializationException {
356+ // Read retry configuration from Maven properties
357+ // Align with Maven Resolver configuration: aether.connector.http.retryHandler.count (default: 3)
358+ maxRetryAttempts = propertyHelper .getGlobalIntProperty (PROP_RETRY_HANDLER_COUNT , DEFAULT_MAX_RETRY_ATTEMPTS );
359+
360+ // Read retry delay configuration
361+ // Maven uses aether.connector.http.retryHandler.interval in milliseconds, we use seconds
362+ // Convert from milliseconds to seconds, defaulting to 5 seconds if not set
363+ int retryIntervalMs = propertyHelper .getGlobalIntProperty (PROP_RETRY_HANDLER_INTERVAL , DEFAULT_RETRY_DELAY_SECONDS * 1000 );
364+ retryDelaySeconds = (int ) TimeUnit .MILLISECONDS .toSeconds (retryIntervalMs );
365+ if (retryDelaySeconds == 0 && retryIntervalMs > 0 ) {
366+ retryDelaySeconds = 1 ; // Minimum 1 second if interval was set but less than 1 second
367+ } else if (retryDelaySeconds == 0 ) {
368+ retryDelaySeconds = DEFAULT_RETRY_DELAY_SECONDS ; // Use default if interval is 0
369+ }
370+
339371 ProxySelector proxySelector = new ProxySelector () {
340372
341373 @ Override
0 commit comments