From 148ce3f64aa9b2f643112d9461693c906c933910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20D=C3=BCmont?= Date: Tue, 18 Nov 2025 09:29:36 +0100 Subject: [PATCH 1/2] Set default retry strategy to no-retries --- .../connectivity/DefaultApacheHttpClient5Factory.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cloudplatform/connectivity-apache-httpclient5/src/main/java/com/sap/cloud/sdk/cloudplatform/connectivity/DefaultApacheHttpClient5Factory.java b/cloudplatform/connectivity-apache-httpclient5/src/main/java/com/sap/cloud/sdk/cloudplatform/connectivity/DefaultApacheHttpClient5Factory.java index f7660519b..8f702742a 100644 --- a/cloudplatform/connectivity-apache-httpclient5/src/main/java/com/sap/cloud/sdk/cloudplatform/connectivity/DefaultApacheHttpClient5Factory.java +++ b/cloudplatform/connectivity-apache-httpclient5/src/main/java/com/sap/cloud/sdk/cloudplatform/connectivity/DefaultApacheHttpClient5Factory.java @@ -14,6 +14,7 @@ import org.apache.hc.client5.http.classic.HttpClient; import org.apache.hc.client5.http.config.ConnectionConfig; import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.impl.DefaultHttpRequestRetryStrategy; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.client5.http.impl.classic.HttpClients; @@ -26,6 +27,7 @@ import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.HttpRequestInterceptor; import org.apache.hc.core5.http.io.SocketConfig; +import org.apache.hc.core5.util.TimeValue; import org.apache.hc.core5.util.Timeout; import com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException; @@ -92,6 +94,7 @@ private CloseableHttpClient buildHttpClient( .custom() .setConnectionManager(getConnectionManager(destination)) .setDefaultRequestConfig(requestConfig) + .setRetryStrategy(new DefaultHttpRequestRetryStrategy(0, TimeValue.ZERO_MILLISECONDS)) .setProxy(getProxy(destination)); if( requestInterceptor != null ) { From 7b6ff0df6559a32690dd31b6c21c0e88eb1559cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20D=C3=BCmont?= Date: Thu, 20 Nov 2025 12:35:58 +0100 Subject: [PATCH 2/2] Add retry log message --- .../DefaultApacheHttpClient5Factory.java | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/cloudplatform/connectivity-apache-httpclient5/src/main/java/com/sap/cloud/sdk/cloudplatform/connectivity/DefaultApacheHttpClient5Factory.java b/cloudplatform/connectivity-apache-httpclient5/src/main/java/com/sap/cloud/sdk/cloudplatform/connectivity/DefaultApacheHttpClient5Factory.java index 8f702742a..704785a9d 100644 --- a/cloudplatform/connectivity-apache-httpclient5/src/main/java/com/sap/cloud/sdk/cloudplatform/connectivity/DefaultApacheHttpClient5Factory.java +++ b/cloudplatform/connectivity-apache-httpclient5/src/main/java/com/sap/cloud/sdk/cloudplatform/connectivity/DefaultApacheHttpClient5Factory.java @@ -25,9 +25,11 @@ import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; import org.apache.hc.client5.http.ssl.TlsSocketStrategy; import org.apache.hc.core5.http.HttpHost; +import org.apache.hc.core5.http.HttpRequest; import org.apache.hc.core5.http.HttpRequestInterceptor; +import org.apache.hc.core5.http.HttpResponse; import org.apache.hc.core5.http.io.SocketConfig; -import org.apache.hc.core5.util.TimeValue; +import org.apache.hc.core5.http.protocol.HttpContext; import org.apache.hc.core5.util.Timeout; import com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException; @@ -94,7 +96,7 @@ private CloseableHttpClient buildHttpClient( .custom() .setConnectionManager(getConnectionManager(destination)) .setDefaultRequestConfig(requestConfig) - .setRetryStrategy(new DefaultHttpRequestRetryStrategy(0, TimeValue.ZERO_MILLISECONDS)) + .setRetryStrategy(new LoggingHttpRequestRetryStrategy(destination)) .setProxy(getProxy(destination)); if( requestInterceptor != null ) { @@ -236,4 +238,42 @@ private boolean isValidProxyConfigurationUriInDestination( @Nullable final HttpD } return true; } + + private static class LoggingHttpRequestRetryStrategy extends DefaultHttpRequestRetryStrategy + { + final @Nullable HttpDestinationProperties destination; + + public LoggingHttpRequestRetryStrategy( final @Nullable HttpDestinationProperties destination ) + { + super(); + this.destination = destination; + } + + @Override + public boolean retryRequest( final HttpResponse response, final int execCount, final HttpContext context ) + { + final boolean retry = super.retryRequest(response, execCount, context); + if( retry ) { + final String msg = "Retrying request for destination {} due to response {}. Retry attempt #{}."; + log.debug(msg, destination, response.getCode(), execCount); + } + return retry; + } + + @Override + public boolean retryRequest( + final HttpRequest req, + final IOException exception, + final int execCount, + final HttpContext context ) + { + final boolean retry = super.retryRequest(req, exception, execCount, context); + if( retry ) { + final String msg = + "Retrying {} request for destination {} to {} due to exception \"{}\". Retry attempt #{}."; + log.debug(msg, req.getMethod(), destination, req.getRequestUri(), exception.getMessage(), execCount); + } + return retry; + } + } }