SLING-10860 ignore server retries if response status code is in the expected status
diff --git a/src/main/java/org/apache/sling/testing/Constants.java b/src/main/java/org/apache/sling/testing/Constants.java
index 37e2aee..f671cae 100644
--- a/src/main/java/org/apache/sling/testing/Constants.java
+++ b/src/main/java/org/apache/sling/testing/Constants.java
@@ -32,4 +32,9 @@
*/
public static final String PARAMETER_CHARSET = "_charset_";
public static final String CHARSET_UTF8 = "utf-8";
+
+ /**
+ * Http Context Attributes
+ */
+ public static final String EXPECTED_STATUS = "expected_status";
}
diff --git a/src/main/java/org/apache/sling/testing/clients/AbstractSlingClient.java b/src/main/java/org/apache/sling/testing/clients/AbstractSlingClient.java
index 59622c8..ba0f0c4 100644
--- a/src/main/java/org/apache/sling/testing/clients/AbstractSlingClient.java
+++ b/src/main/java/org/apache/sling/testing/clients/AbstractSlingClient.java
@@ -37,6 +37,8 @@
import java.util.Map;
import java.util.UUID;
+import static org.apache.sling.testing.Constants.EXPECTED_STATUS;
+
/**
* The abstract base client for all implementing integration test clients.
*/
@@ -309,6 +311,7 @@
throws ClientException {
// create context from config
HttpClientContext context = createHttpClientContextFromConfig();
+ context.setAttribute(EXPECTED_STATUS, expectedStatus);
// add headers
if (headers != null) {
@@ -360,6 +363,7 @@
throws ClientException {
// create context from config
HttpClientContext context = createHttpClientContextFromConfig();
+ context.setAttribute(EXPECTED_STATUS, expectedStatus);
HttpHost host = new HttpHost(getUrl().getHost(), getUrl().getPort(), getUrl().getScheme());
HttpRequest request = new BasicHttpRequest(method, uri);
diff --git a/src/main/java/org/apache/sling/testing/clients/util/ServerErrorRetryStrategy.java b/src/main/java/org/apache/sling/testing/clients/util/ServerErrorRetryStrategy.java
index 0ba972e..5ae0903 100644
--- a/src/main/java/org/apache/sling/testing/clients/util/ServerErrorRetryStrategy.java
+++ b/src/main/java/org/apache/sling/testing/clients/util/ServerErrorRetryStrategy.java
@@ -29,6 +29,7 @@
import java.util.Collection;
import static org.apache.http.HttpStatus.*;
+import static org.apache.sling.testing.Constants.EXPECTED_STATUS;
/**
* {code ServiceUnavailableRetryStrategy} strategy for retrying request in case of a 5XX response code
@@ -43,8 +44,8 @@
@Override
public boolean retryRequest(final HttpResponse response, final int executionCount, final HttpContext context) {
- boolean needsRetry = executionCount <= SystemPropertiesConfig.getHttpRetries() && responseRetryCondition(response);
-
+ int[] expectedStatus = (int[]) context.getAttribute(EXPECTED_STATUS);
+ boolean needsRetry = executionCount <= SystemPropertiesConfig.getHttpRetries() && responseRetryCondition(response, expectedStatus);
if (SystemPropertiesConfig.isHttpLogRetries() && needsRetry && LOG.isWarnEnabled()) {
LOG.warn("Request retry needed due to service unavailable response");
LOG.warn("Response headers contained:");
@@ -64,9 +65,13 @@
return SystemPropertiesConfig.getHttpRetriesDelay();
}
- private boolean responseRetryCondition(final HttpResponse response) {
+ private boolean responseRetryCondition(final HttpResponse response, int... expectedStatus) {
final Integer statusCode = response.getStatusLine().getStatusCode();
final Collection<Integer> errorCodes = SystemPropertiesConfig.getHttpRetriesErrorCodes();
+ if ((expectedStatus != null) && (expectedStatus.length > 0) &&
+ Arrays.stream(expectedStatus).anyMatch(expected -> statusCode == expected)) {
+ return true;
+ }
if (errorCodes != null && !errorCodes.isEmpty()) {
return errorCodes.contains(statusCode);
} else {