Skip to content

Commit 23bd3d3

Browse files
committed
Append user agent for retry mode
1 parent 69b1f42 commit 23bd3d3

File tree

5 files changed

+64
-0
lines changed

5 files changed

+64
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"category": "AWS SDK for Java v2",
3+
"contributor": "",
4+
"type": "feature",
5+
"description": "Include the retry mode STANDARD or LEGACY in the user agents list."
6+
}

core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/ApplyUserAgentStage.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public class ApplyUserAgentStage implements MutableRequestToRequestPipeline {
4242

4343
private static final String IO = "io";
4444
private static final String HTTP = "http";
45+
private static final String CONFIG = "cfg";
46+
private static final String RETRY_MODE = "retry-mode";
4547

4648
private static final String AWS_EXECUTION_ENV_PREFIX = "exec-env/";
4749

@@ -94,6 +96,15 @@ private StringBuilder getUserAgent(SdkClientConfiguration config, List<ApiName>
9496
.append("/")
9597
.append(SdkHttpUtils.urlEncode(clientName));
9698

99+
String retryMode = config.option(SdkClientOption.RETRY_POLICY).retryMode().toString();
100+
101+
userAgent.append(SPACE)
102+
.append(CONFIG)
103+
.append("/")
104+
.append(RETRY_MODE)
105+
.append("/")
106+
.append(StringUtils.lowerCase(retryMode));
107+
97108
if (!requestApiNames.isEmpty()) {
98109
String requestUserAgent = requestApiNames.stream()
99110
.map(n -> n.name() + "/" + n.version())

core/sdk-core/src/main/java/software/amazon/awssdk/core/retry/RetryPolicy.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import software.amazon.awssdk.core.retry.conditions.RetryCondition;
2626
import software.amazon.awssdk.core.retry.conditions.TokenBucketRetryCondition;
2727
import software.amazon.awssdk.utils.ToString;
28+
import software.amazon.awssdk.utils.Validate;
2829
import software.amazon.awssdk.utils.builder.CopyableBuilder;
2930
import software.amazon.awssdk.utils.builder.ToCopyableBuilder;
3031

@@ -103,6 +104,9 @@ public static Builder builder() {
103104
* Create a {@link RetryPolicy.Builder} populated with the defaults from the provided {@link RetryMode}.
104105
*/
105106
public static Builder builder(RetryMode retryMode) {
107+
Validate.paramNotNull(retryMode, "The retry mode cannot be set as null. If you don't want to set the retry mode,"
108+
+ " please use the other builder method without setting retry mode, and the default retry"
109+
+ " mode will be used.");
106110
return new BuilderImpl(retryMode);
107111
}
108112

core/sdk-core/src/test/java/software/amazon/awssdk/core/http/AmazonHttpClientTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import software.amazon.awssdk.core.exception.SdkClientException;
4444
import software.amazon.awssdk.core.internal.http.AmazonSyncHttpClient;
4545
import software.amazon.awssdk.core.internal.http.timers.ClientExecutionAndRequestTimerTestUtils;
46+
import software.amazon.awssdk.core.retry.RetryMode;
47+
import software.amazon.awssdk.core.retry.RetryPolicy;
4648
import software.amazon.awssdk.http.ExecutableHttpRequest;
4749
import software.amazon.awssdk.http.HttpExecuteRequest;
4850
import software.amazon.awssdk.http.HttpExecuteResponse;
@@ -183,6 +185,33 @@ public void testUserAgentContainsHttpClientInfo() {
183185
Assert.assertTrue(userAgent.contains("http/UNKNOWN"));
184186
}
185187

188+
@Test
189+
public void testUserAgentContainsRetryModeInfo() {
190+
HttpResponseHandler<?> handler = mock(HttpResponseHandler.class);
191+
192+
SdkClientConfiguration config = HttpTestUtils.testClientConfiguration().toBuilder()
193+
.option(SdkClientOption.SYNC_HTTP_CLIENT, sdkHttpClient)
194+
.option(SdkClientOption.CLIENT_TYPE, ClientType.SYNC)
195+
.option(SdkClientOption.ENDPOINT, URI.create("http://example.com"))
196+
.option(SdkClientOption.RETRY_POLICY, RetryPolicy.forRetryMode(RetryMode.STANDARD))
197+
.build();
198+
AmazonSyncHttpClient client = new AmazonSyncHttpClient(config);
199+
200+
client.requestExecutionBuilder()
201+
.request(ValidSdkObjects.sdkHttpFullRequest().build())
202+
.originalRequest(NoopTestRequest.builder().build())
203+
.executionContext(ClientExecutionAndRequestTimerTestUtils.executionContext(null))
204+
.execute(combinedSyncResponseHandler(handler, null));
205+
206+
ArgumentCaptor<HttpExecuteRequest> httpRequestCaptor = ArgumentCaptor.forClass(HttpExecuteRequest.class);
207+
verify(sdkHttpClient).prepareRequest(httpRequestCaptor.capture());
208+
209+
final String userAgent = httpRequestCaptor.getValue().httpRequest().firstMatchingHeader("User-Agent")
210+
.orElseThrow(() -> new AssertionError("User-Agent header was not found"));
211+
212+
Assert.assertTrue(userAgent.contains("cfg/retry-mode/standard"));
213+
}
214+
186215
@Test
187216
public void closeClient_shouldCloseDependencies() {
188217
SdkClientConfiguration config = HttpTestUtils.testClientConfiguration()

core/sdk-core/src/test/java/software/amazon/awssdk/core/retry/RetryPolicyTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package software.amazon.awssdk.core.retry;
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1920
import static org.mockito.Mockito.verify;
2021

2122
import org.junit.Assert;
@@ -82,6 +83,19 @@ public void nonRetryPolicy_shouldUseNullCondition() {
8283
assertThat(noneRetry.throttlingBackoffStrategy()).isEqualTo(BackoffStrategy.none());
8384
}
8485

86+
@Test
87+
public void nonRetryMode_shouldUseDefaultRetryMode() {
88+
RetryPolicy policy = RetryPolicy.builder().build();
89+
assertThat(policy.retryMode().toString()).isEqualTo("LEGACY");
90+
}
91+
92+
@Test
93+
public void nullRetryMode_shouldThrowNullPointerException() {
94+
assertThatThrownBy(() -> RetryPolicy.builder(null).build())
95+
.isInstanceOf(NullPointerException.class)
96+
.hasMessageContaining("retry mode cannot be set as null");
97+
}
98+
8599
@Test
86100
public void maxRetriesFromRetryModeIsCorrect() {
87101
assertThat(RetryPolicy.forRetryMode(RetryMode.LEGACY).numRetries()).isEqualTo(3);

0 commit comments

Comments
 (0)