Skip to content

Commit 823f0bd

Browse files
committed
Address PR feedback
1 parent 558ac66 commit 823f0bd

8 files changed

Lines changed: 193 additions & 5 deletions

File tree

codegen/src/main/java/software/amazon/awssdk/codegen/poet/auth/scheme/AuthSchemeInterceptorSpec.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,10 @@ private MethodSpec generateBeforeExecution() {
161161

162162
if (authSchemeSpecUtils.hasSigV4aSupport()) {
163163
builder.beginControlFlow("if (selectedAuthScheme != null && "
164-
+ "selectedAuthScheme.authSchemeOption().schemeId().equals($S))",
165-
"aws.auth#sigv4a")
164+
+ "selectedAuthScheme.authSchemeOption().schemeId().equals($S) && "
165+
+ "!$T.isSignerOverridden(context.request(), executionAttributes))",
166+
"aws.auth#sigv4a",
167+
ClassName.get("software.amazon.awssdk.awscore.util", "SignerOverrideUtils"))
166168
.addStatement("$T businessMetrics = executionAttributes.getAttribute($T.BUSINESS_METRICS)",
167169
ClassName.get("software.amazon.awssdk.core.useragent", "BusinessMetricCollection"),
168170
SdkInternalExecutionAttribute.class)

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/auth/scheme/ops-auth-sigv4a-value-auth-scheme-interceptor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import software.amazon.awssdk.annotations.Generated;
1111
import software.amazon.awssdk.annotations.SdkInternalApi;
1212
import software.amazon.awssdk.awscore.AwsExecutionAttribute;
13+
import software.amazon.awssdk.awscore.util.SignerOverrideUtils;
1314
import software.amazon.awssdk.core.SdkRequest;
1415
import software.amazon.awssdk.core.SelectedAuthScheme;
1516
import software.amazon.awssdk.core.exception.SdkException;
@@ -51,7 +52,8 @@ public void beforeExecution(Context.BeforeExecution context, ExecutionAttributes
5152
List<AuthSchemeOption> authOptions = resolveAuthOptions(context, executionAttributes);
5253
SelectedAuthScheme<? extends Identity> selectedAuthScheme = selectAuthScheme(authOptions, executionAttributes);
5354
putSelectedAuthScheme(executionAttributes, selectedAuthScheme);
54-
if (selectedAuthScheme != null && selectedAuthScheme.authSchemeOption().schemeId().equals("aws.auth#sigv4a")) {
55+
if (selectedAuthScheme != null && selectedAuthScheme.authSchemeOption().schemeId().equals("aws.auth#sigv4a")
56+
&& !SignerOverrideUtils.isSignerOverridden(context.request(), executionAttributes)) {
5557
BusinessMetricCollection businessMetrics = executionAttributes
5658
.getAttribute(SdkInternalExecutionAttribute.BUSINESS_METRICS);
5759
if (businessMetrics != null) {

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/auth/scheme/query-endpoint-auth-params-with-allowlist-auth-scheme-interceptor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import software.amazon.awssdk.annotations.Generated;
1111
import software.amazon.awssdk.annotations.SdkInternalApi;
1212
import software.amazon.awssdk.awscore.AwsExecutionAttribute;
13+
import software.amazon.awssdk.awscore.util.SignerOverrideUtils;
1314
import software.amazon.awssdk.core.SdkRequest;
1415
import software.amazon.awssdk.core.SelectedAuthScheme;
1516
import software.amazon.awssdk.core.exception.SdkException;
@@ -54,7 +55,8 @@ public void beforeExecution(Context.BeforeExecution context, ExecutionAttributes
5455
List<AuthSchemeOption> authOptions = resolveAuthOptions(context, executionAttributes);
5556
SelectedAuthScheme<? extends Identity> selectedAuthScheme = selectAuthScheme(authOptions, executionAttributes);
5657
putSelectedAuthScheme(executionAttributes, selectedAuthScheme);
57-
if (selectedAuthScheme != null && selectedAuthScheme.authSchemeOption().schemeId().equals("aws.auth#sigv4a")) {
58+
if (selectedAuthScheme != null && selectedAuthScheme.authSchemeOption().schemeId().equals("aws.auth#sigv4a")
59+
&& !SignerOverrideUtils.isSignerOverridden(context.request(), executionAttributes)) {
5860
BusinessMetricCollection businessMetrics = executionAttributes
5961
.getAttribute(SdkInternalExecutionAttribute.BUSINESS_METRICS);
6062
if (businessMetrics != null) {

codegen/src/test/resources/software/amazon/awssdk/codegen/poet/auth/scheme/query-endpoint-auth-params-without-allowlist-auth-scheme-interceptor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import software.amazon.awssdk.annotations.Generated;
1111
import software.amazon.awssdk.annotations.SdkInternalApi;
1212
import software.amazon.awssdk.awscore.AwsExecutionAttribute;
13+
import software.amazon.awssdk.awscore.util.SignerOverrideUtils;
1314
import software.amazon.awssdk.core.SdkRequest;
1415
import software.amazon.awssdk.core.SelectedAuthScheme;
1516
import software.amazon.awssdk.core.exception.SdkException;
@@ -54,7 +55,8 @@ public void beforeExecution(Context.BeforeExecution context, ExecutionAttributes
5455
List<AuthSchemeOption> authOptions = resolveAuthOptions(context, executionAttributes);
5556
SelectedAuthScheme<? extends Identity> selectedAuthScheme = selectAuthScheme(authOptions, executionAttributes);
5657
putSelectedAuthScheme(executionAttributes, selectedAuthScheme);
57-
if (selectedAuthScheme != null && selectedAuthScheme.authSchemeOption().schemeId().equals("aws.auth#sigv4a")) {
58+
if (selectedAuthScheme != null && selectedAuthScheme.authSchemeOption().schemeId().equals("aws.auth#sigv4a")
59+
&& !SignerOverrideUtils.isSignerOverridden(context.request(), executionAttributes)) {
5860
BusinessMetricCollection businessMetrics = executionAttributes
5961
.getAttribute(SdkInternalExecutionAttribute.BUSINESS_METRICS);
6062
if (businessMetrics != null) {

test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/Sigv4aBusinessMetricUserAgentTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
import org.junit.jupiter.api.Test;
2424
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
2525
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
26+
import software.amazon.awssdk.auth.signer.Aws4Signer;
27+
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
28+
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
2629
import software.amazon.awssdk.core.useragent.BusinessMetricFeatureId;
2730
import software.amazon.awssdk.http.AbortableInputStream;
2831
import software.amazon.awssdk.http.HttpExecuteResponse;
@@ -33,9 +36,11 @@
3336
import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonClient;
3437
import software.amazon.awssdk.services.sigv4aauth.Sigv4AauthAsyncClient;
3538
import software.amazon.awssdk.services.sigv4aauth.Sigv4AauthClient;
39+
import software.amazon.awssdk.services.sigv4aauth.auth.scheme.Sigv4AauthAuthSchemeProvider;
3640
import software.amazon.awssdk.testutils.service.http.MockAsyncHttpClient;
3741
import software.amazon.awssdk.testutils.service.http.MockSyncHttpClient;
3842
import software.amazon.awssdk.utils.StringInputStream;
43+
import java.util.Arrays;
3944

4045
/**
4146
* Test class to verify that SIGV4A_SIGNING business metric is correctly included
@@ -118,6 +123,45 @@ void when_regularServiceIsUsedAsync_sigv4aMetricIsNotAdded() {
118123
assertThat(userAgent).doesNotMatch(METRIC_SEARCH_PATTERN.apply(BusinessMetricFeatureId.SIGV4A_SIGNING.value()));
119124
}
120125

126+
@Test
127+
void when_signerIsOverridden_sigv4aMetricIsNotAdded() {
128+
Sigv4AauthClient client = Sigv4AauthClient.builder()
129+
.region(Region.US_WEST_2)
130+
.credentialsProvider(CREDENTIALS_PROVIDER)
131+
.overrideConfiguration(ClientOverrideConfiguration.builder()
132+
.putAdvancedOption(SdkAdvancedClientOption.SIGNER, Aws4Signer.create())
133+
.build())
134+
.httpClient(mockHttpClient)
135+
.build();
136+
137+
client.simpleOperationWithNoEndpointParams(r -> r.stringMember("test"));
138+
139+
String userAgent = getUserAgentFromLastRequest();
140+
System.out.println("Signer override User-Agent: " + userAgent);
141+
142+
assertThat(userAgent).doesNotMatch(METRIC_SEARCH_PATTERN.apply(BusinessMetricFeatureId.SIGV4A_SIGNING.value()));
143+
}
144+
145+
146+
@Test
147+
void when_authSchemeProviderOverridesSigv4aOrder_sigv4IsSelected() {
148+
Sigv4AauthClient client = Sigv4AauthClient.builder()
149+
.region(Region.US_WEST_2)
150+
.credentialsProvider(CREDENTIALS_PROVIDER)
151+
.authSchemeProvider(Sigv4AauthAuthSchemeProvider.
152+
defaultProvider(
153+
Arrays.asList("sigv4","sigv4a")))
154+
.httpClient(mockHttpClient)
155+
.build();
156+
157+
client.simpleOperationWithNoEndpointParams(r -> r.stringMember("test"));
158+
159+
String userAgent = getUserAgentFromLastRequest();
160+
System.out.println("User-Agent: " + userAgent);
161+
162+
assertThat(userAgent).doesNotMatch(METRIC_SEARCH_PATTERN.apply(BusinessMetricFeatureId.SIGV4A_SIGNING.value()));
163+
}
164+
121165
private String getUserAgentFromLastRequest() {
122166
SdkHttpRequest lastRequest = mockHttpClient.getLastRequest();
123167
assertThat(lastRequest).isNotNull();

test/crt-unavailable-tests/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@
106106
<artifactId>checksums</artifactId>
107107
<version>${awsjavasdk.version}</version>
108108
</dependency>
109+
<dependency>
110+
<groupId>software.amazon.awssdk</groupId>
111+
<artifactId>service-test-utils</artifactId>
112+
<version>${awsjavasdk.version}</version>
113+
<scope>test</scope>
114+
</dependency>
109115
</dependencies>
110116

111117
<build>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"version":"2.0",
3+
"metadata":{
4+
"apiVersion":"2016-03-11",
5+
"endpointPrefix":"internalconfig",
6+
"jsonVersion":"1.1",
7+
"protocol":"rest-json",
8+
"serviceAbbreviation":"AwsSigv4aMultiAuthService",
9+
"serviceFullName":"AWS Multi Auth Service",
10+
"serviceId":"Sigv4aauth",
11+
"targetPrefix":"Sigv4aauth",
12+
"auth":["aws.auth#sigv4a","aws.auth#sigv4"],
13+
"timestampFormat":"unixTimestamp",
14+
"uid":"restjson-2016-03-11"
15+
},
16+
"operations":{
17+
"simpleOperationWithNoEndpointParams":{
18+
"name":"simpleOperationWithNoEndpointParams",
19+
"http":{
20+
"method":"POST",
21+
"requestUri":"/2016-03-11/simpleOperationWithNoEndpointParams"
22+
},
23+
"input":{"shape":"SampleRequest"}
24+
},
25+
"simpleOperationWithEndpointParams":{
26+
"name":"simpleOperationWithEndpointParams",
27+
"http":{
28+
"method":"POST",
29+
"requestUri":"/2016-03-11/multiAuthWithOnlySigv4aAndSigv4"
30+
},
31+
"input":{"shape":"SampleRequest"}
32+
}
33+
},
34+
"shapes": {
35+
"SampleRequest": {
36+
"type": "structure",
37+
"members": {
38+
"StringMember": {
39+
"shape": "String"
40+
}
41+
}
42+
},
43+
"String":{"type":"string"}
44+
}
45+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.services;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
import static software.amazon.awssdk.core.useragent.BusinessMetricCollection.METRIC_SEARCH_PATTERN;
20+
21+
import java.util.List;
22+
import org.junit.jupiter.api.BeforeEach;
23+
import org.junit.jupiter.api.Test;
24+
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
25+
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
26+
import software.amazon.awssdk.core.useragent.BusinessMetricFeatureId;
27+
import software.amazon.awssdk.http.AbortableInputStream;
28+
import software.amazon.awssdk.http.HttpExecuteResponse;
29+
import software.amazon.awssdk.http.SdkHttpRequest;
30+
import software.amazon.awssdk.http.SdkHttpResponse;
31+
import software.amazon.awssdk.regions.Region;
32+
import software.amazon.awssdk.services.sigv4aauth.Sigv4AauthClient;
33+
import software.amazon.awssdk.testutils.service.http.MockSyncHttpClient;
34+
import software.amazon.awssdk.utils.StringInputStream;
35+
36+
/**
37+
* Test class to verify that SIGV4A_SIGNING business metric is NOT included
38+
* in the User-Agent header when CRT is not available on the classpath.
39+
*/
40+
class Sigv4aCrtUnavailableBusinessMetricTest {
41+
private static final String USER_AGENT_HEADER_NAME = "User-Agent";
42+
private static final StaticCredentialsProvider CREDENTIALS_PROVIDER =
43+
StaticCredentialsProvider.create(AwsBasicCredentials.create("akid", "skid"));
44+
45+
private MockSyncHttpClient mockHttpClient;
46+
47+
@BeforeEach
48+
public void setup() {
49+
mockHttpClient = new MockSyncHttpClient();
50+
mockHttpClient.stubNextResponse(mockResponse());
51+
}
52+
53+
@Test
54+
void when_crtUnavailable_sigv4aFallsBackToSigv4_noSigv4aMetric() {
55+
56+
Sigv4AauthClient client = Sigv4AauthClient.builder()
57+
.region(Region.US_WEST_2)
58+
.credentialsProvider(CREDENTIALS_PROVIDER)
59+
.httpClient(mockHttpClient)
60+
.build();
61+
62+
client.simpleOperationWithNoEndpointParams(r -> r.stringMember("test"));
63+
64+
String userAgent = getUserAgentFromLastRequest();
65+
System.out.println("CRT unavailable User-Agent: " + userAgent);
66+
67+
assertThat(userAgent).doesNotMatch(METRIC_SEARCH_PATTERN.apply(BusinessMetricFeatureId.SIGV4A_SIGNING.value()));
68+
}
69+
70+
private String getUserAgentFromLastRequest() {
71+
SdkHttpRequest lastRequest = mockHttpClient.getLastRequest();
72+
assertThat(lastRequest).isNotNull();
73+
74+
List<String> userAgentHeaders = lastRequest.headers().get(USER_AGENT_HEADER_NAME);
75+
assertThat(userAgentHeaders).isNotNull().hasSize(1);
76+
return userAgentHeaders.get(0);
77+
}
78+
79+
private static HttpExecuteResponse mockResponse() {
80+
return HttpExecuteResponse.builder()
81+
.response(SdkHttpResponse.builder().statusCode(200).build())
82+
.responseBody(AbortableInputStream.create(new StringInputStream("{}")))
83+
.build();
84+
}
85+
}

0 commit comments

Comments
 (0)