Skip to content

Commit cca889b

Browse files
authored
HttpChecksumResolver#getResolvedChecksumSpecs returns ChecksumSpecs when defined in ExecutionAttributes to avoid unncessary calls for resolving it (#3509)
1 parent 9faac83 commit cca889b

File tree

4 files changed

+75
-4
lines changed

4 files changed

+75
-4
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": "bugfix",
5+
"description": "HttpChecksumResolver.getResolvedChecksumSpecs() first attempts retrieval of checksum from ExecutionAttributes before resolving it"
6+
}

core/aws-core/src/main/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private AwsExecutionContextBuilder() {
9999
.putAttribute(SdkExecutionAttribute.SIGNER_OVERRIDDEN, clientConfig.option(SdkClientOption.SIGNER_OVERRIDDEN))
100100
.putAttribute(AwsExecutionAttribute.USE_GLOBAL_ENDPOINT,
101101
clientConfig.option(AwsClientOption.USE_GLOBAL_ENDPOINT))
102-
.putAttribute(RESOLVED_CHECKSUM_SPECS, HttpChecksumResolver.getResolvedChecksumSpecs(executionAttributes));
102+
.putAttribute(RESOLVED_CHECKSUM_SPECS, HttpChecksumResolver.resolveChecksumSpecs(executionAttributes));
103103

104104
ExecutionInterceptorChain executionInterceptorChain =
105105
new ExecutionInterceptorChain(clientConfig.option(SdkClientOption.EXECUTION_INTERCEPTORS));

core/aws-core/src/test/java/software/amazon/awssdk/awscore/internal/AwsExecutionContextBuilderTest.java

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,22 @@
3131
import org.mockito.Mock;
3232
import org.mockito.junit.MockitoJUnitRunner;
3333
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
34-
import software.amazon.awssdk.auth.signer.AwsSignerExecutionAttribute;
3534
import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration;
3635
import software.amazon.awssdk.awscore.client.config.AwsClientOption;
37-
import software.amazon.awssdk.awscore.internal.AwsExecutionContextBuilder;
3836
import software.amazon.awssdk.core.SdkRequest;
3937
import software.amazon.awssdk.core.SdkResponse;
38+
import software.amazon.awssdk.core.checksums.ChecksumSpecs;
4039
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
4140
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
4241
import software.amazon.awssdk.core.client.config.SdkClientOption;
4342
import software.amazon.awssdk.core.client.handler.ClientExecutionParams;
4443
import software.amazon.awssdk.core.http.ExecutionContext;
45-
import software.amazon.awssdk.core.interceptor.ExecutionAttribute;
4644
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
4745
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
4846
import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute;
47+
import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute;
48+
import software.amazon.awssdk.core.interceptor.trait.HttpChecksum;
49+
import software.amazon.awssdk.core.internal.util.HttpChecksumUtils;
4950
import software.amazon.awssdk.core.signer.Signer;
5051

5152
@RunWith(MockitoJUnitRunner.class)
@@ -120,6 +121,63 @@ public void signing_ifClientOverride_assignClientOverrideSigner() {
120121

121122
assertThat(executionContext.signer()).isEqualTo(clientOverrideSigner);
122123
}
124+
125+
@Test
126+
public void invokeInterceptorsAndCreateExecutionContext_noHttpChecksumTrait_resolvesChecksumSpecs() {
127+
ExecutionContext executionContext =
128+
AwsExecutionContextBuilder.invokeInterceptorsAndCreateExecutionContext(clientExecutionParams(),
129+
testClientConfiguration().build());
130+
131+
ExecutionAttributes executionAttributes = executionContext.executionAttributes();
132+
Optional<ChecksumSpecs> checksumSpecs1 = HttpChecksumUtils.checksumSpecWithRequestAlgorithm(executionAttributes);
133+
Optional<ChecksumSpecs> checksumSpecs2 = HttpChecksumUtils.checksumSpecWithRequestAlgorithm(executionAttributes);
134+
135+
assertThat(checksumSpecs1).isNotPresent();
136+
assertThat(checksumSpecs2).isNotPresent();
137+
assertThat(checksumSpecs1).isSameAs(checksumSpecs2);
138+
}
139+
140+
@Test
141+
public void invokeInterceptorsAndCreateExecutionContext_singleExecutionContext_resolvesChecksumSpecsOnce() {
142+
HttpChecksum httpCrc32Checksum =
143+
HttpChecksum.builder().requestAlgorithm("crc32").isRequestStreaming(true).build();
144+
ClientExecutionParams<SdkRequest, SdkResponse> executionParams = clientExecutionParams()
145+
.putExecutionAttribute(SdkInternalExecutionAttribute.HTTP_CHECKSUM, httpCrc32Checksum);
146+
147+
ExecutionContext executionContext =
148+
AwsExecutionContextBuilder.invokeInterceptorsAndCreateExecutionContext(executionParams,
149+
testClientConfiguration().build());
150+
151+
ExecutionAttributes executionAttributes = executionContext.executionAttributes();
152+
ChecksumSpecs checksumSpecs1 = HttpChecksumUtils.checksumSpecWithRequestAlgorithm(executionAttributes).get();
153+
ChecksumSpecs checksumSpecs2 = HttpChecksumUtils.checksumSpecWithRequestAlgorithm(executionAttributes).get();
154+
155+
assertThat(checksumSpecs1).isSameAs(checksumSpecs2);
156+
}
157+
158+
@Test
159+
public void invokeInterceptorsAndCreateExecutionContext_multipleExecutionContexts_resolvesChecksumSpecsOncePerContext() {
160+
HttpChecksum httpCrc32Checksum = HttpChecksum.builder().requestAlgorithm("crc32").isRequestStreaming(true).build();
161+
ClientExecutionParams<SdkRequest, SdkResponse> executionParams = clientExecutionParams()
162+
.putExecutionAttribute(SdkInternalExecutionAttribute.HTTP_CHECKSUM, httpCrc32Checksum);
163+
SdkClientConfiguration clientConfig = testClientConfiguration().build();
164+
165+
ExecutionContext executionContext1 =
166+
AwsExecutionContextBuilder.invokeInterceptorsAndCreateExecutionContext(executionParams,
167+
clientConfig);
168+
ExecutionAttributes executionAttributes1 = executionContext1.executionAttributes();
169+
ChecksumSpecs checksumSpecs1 = HttpChecksumUtils.checksumSpecWithRequestAlgorithm(executionAttributes1).get();
170+
171+
ExecutionContext executionContext2 =
172+
AwsExecutionContextBuilder.invokeInterceptorsAndCreateExecutionContext(executionParams,
173+
clientConfig);
174+
ExecutionAttributes executionAttributes2 = executionContext2.executionAttributes();
175+
ChecksumSpecs checksumSpecs2 = HttpChecksumUtils.checksumSpecWithRequestAlgorithm(executionAttributes2).get();
176+
ChecksumSpecs checksumSpecs3 = HttpChecksumUtils.checksumSpecWithRequestAlgorithm(executionAttributes2).get();
177+
178+
assertThat(checksumSpecs1).isNotSameAs(checksumSpecs2);
179+
assertThat(checksumSpecs2).isSameAs(checksumSpecs3);
180+
}
123181

124182
private ClientExecutionParams<SdkRequest, SdkResponse> clientExecutionParams() {
125183
return new ClientExecutionParams<SdkRequest, SdkResponse>()

core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/util/HttpChecksumResolver.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
package software.amazon.awssdk.core.internal.util;
1717

1818
import java.util.List;
19+
import java.util.Optional;
1920
import java.util.stream.Collectors;
2021
import software.amazon.awssdk.annotations.SdkInternalApi;
2122
import software.amazon.awssdk.core.checksums.Algorithm;
2223
import software.amazon.awssdk.core.checksums.ChecksumSpecs;
2324
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
25+
import software.amazon.awssdk.core.interceptor.SdkExecutionAttribute;
2426
import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute;
2527
import software.amazon.awssdk.core.interceptor.trait.HttpChecksum;
2628
import software.amazon.awssdk.utils.StringUtils;
@@ -35,6 +37,11 @@ private HttpChecksumResolver() {
3537
}
3638

3739
public static ChecksumSpecs getResolvedChecksumSpecs(ExecutionAttributes executionAttributes) {
40+
return Optional.ofNullable(executionAttributes.getAttribute(SdkExecutionAttribute.RESOLVED_CHECKSUM_SPECS))
41+
.orElseGet(() -> resolveChecksumSpecs(executionAttributes));
42+
}
43+
44+
public static ChecksumSpecs resolveChecksumSpecs(ExecutionAttributes executionAttributes) {
3845
HttpChecksum httpChecksumTraitInOperation = executionAttributes.getAttribute(SdkInternalExecutionAttribute.HTTP_CHECKSUM);
3946
if (httpChecksumTraitInOperation == null) {
4047
return null;

0 commit comments

Comments
 (0)