Skip to content

Commit aa3e3ed

Browse files
authored
Minor refacotring to AwsV4HttpSigner impl (#4556)
* Move public methods to top of DefaultAwsV4HttpSigner And other minor refactoring. * V4Context is not Immutable * Remove content length from builder instead of signed request
1 parent 92e3ea8 commit aa3e3ed

File tree

3 files changed

+39
-36
lines changed

3 files changed

+39
-36
lines changed

core/http-auth-aws/src/main/java/software/amazon/awssdk/http/auth/aws/internal/signer/DefaultAwsV4HttpSigner.java

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,26 @@ public final class DefaultAwsV4HttpSigner implements AwsV4HttpSigner {
5454

5555
private static final int DEFAULT_CHUNK_SIZE_IN_BYTES = 128 * 1024;
5656

57+
@Override
58+
public SignedRequest sign(SignRequest<? extends AwsCredentialsIdentity> request) {
59+
Checksummer checksummer = checksummer(request);
60+
V4Properties v4Properties = v4Properties(request);
61+
V4RequestSigner v4RequestSigner = v4RequestSigner(request, v4Properties);
62+
V4PayloadSigner payloadSigner = v4PayloadSigner(request, v4Properties);
63+
64+
return doSign(request, checksummer, v4RequestSigner, payloadSigner);
65+
}
66+
67+
@Override
68+
public CompletableFuture<AsyncSignedRequest> signAsync(AsyncSignRequest<? extends AwsCredentialsIdentity> request) {
69+
Checksummer checksummer = checksummer(request);
70+
V4Properties v4Properties = v4Properties(request);
71+
V4RequestSigner v4RequestSigner = v4RequestSigner(request, v4Properties);
72+
V4PayloadSigner payloadSigner = v4PayloadAsyncSigner(request, v4Properties);
73+
74+
return doSign(request, checksummer, v4RequestSigner, payloadSigner);
75+
}
76+
5777
private static V4Properties v4Properties(BaseSignRequest<?, ? extends AwsCredentialsIdentity> request) {
5878
Clock signingClock = request.requireProperty(SIGNING_CLOCK, Clock.systemUTC());
5979
Instant signingInstant = signingClock.instant();
@@ -106,17 +126,6 @@ private static V4RequestSigner v4RequestSigner(
106126
return requestSigner.apply(v4Properties);
107127
}
108128

109-
private static boolean hasChecksumHeader(BaseSignRequest<?, ? extends AwsCredentialsIdentity> request) {
110-
ChecksumAlgorithm checksumAlgorithm = request.property(CHECKSUM_ALGORITHM);
111-
112-
if (checksumAlgorithm != null) {
113-
String checksumHeaderName = checksumHeaderName(checksumAlgorithm);
114-
return request.request().firstMatchingHeader(checksumHeaderName).isPresent();
115-
}
116-
117-
return false;
118-
}
119-
120129
private static Checksummer checksummer(BaseSignRequest<?, ? extends AwsCredentialsIdentity> request) {
121130
boolean isPayloadSigning = isPayloadSigning(request);
122131
boolean isEventStreaming = isEventStreaming(request.request());
@@ -161,14 +170,8 @@ private static Checksummer checksummer(BaseSignRequest<?, ? extends AwsCredentia
161170
return Checksummer.forPrecomputed256Checksum(UNSIGNED_PAYLOAD);
162171
}
163172

164-
private static boolean useChunkEncoding(boolean payloadSigningEnabled, boolean chunkEncodingEnabled,
165-
boolean isTrailingOrFlexible) {
166-
167-
return (payloadSigningEnabled && chunkEncodingEnabled) || (chunkEncodingEnabled && isTrailingOrFlexible);
168-
}
169-
170173
private static V4PayloadSigner v4PayloadSigner(
171-
BaseSignRequest<?, ? extends AwsCredentialsIdentity> request,
174+
SignRequest<? extends AwsCredentialsIdentity> request,
172175
V4Properties properties) {
173176

174177
boolean isPayloadSigning = isPayloadSigning(request);
@@ -200,7 +203,7 @@ private static V4PayloadSigner v4PayloadSigner(
200203
}
201204

202205
private static V4PayloadSigner v4PayloadAsyncSigner(
203-
BaseSignRequest<?, ? extends AwsCredentialsIdentity> request,
206+
AsyncSignRequest<? extends AwsCredentialsIdentity> request,
204207
V4Properties properties) {
205208

206209
boolean isPayloadSigning = request.requireProperty(PAYLOAD_SIGNING_ENABLED, true);
@@ -289,23 +292,20 @@ private static boolean isEventStreaming(SdkHttpRequest request) {
289292
return "application/vnd.amazon.eventstream".equals(request.firstMatchingHeader(Header.CONTENT_TYPE).orElse(""));
290293
}
291294

292-
@Override
293-
public SignedRequest sign(SignRequest<? extends AwsCredentialsIdentity> request) {
294-
Checksummer checksummer = checksummer(request);
295-
V4Properties v4Properties = v4Properties(request);
296-
V4RequestSigner v4RequestSigner = v4RequestSigner(request, v4Properties);
297-
V4PayloadSigner payloadSigner = v4PayloadSigner(request, v4Properties);
295+
private static boolean hasChecksumHeader(BaseSignRequest<?, ? extends AwsCredentialsIdentity> request) {
296+
ChecksumAlgorithm checksumAlgorithm = request.property(CHECKSUM_ALGORITHM);
298297

299-
return doSign(request, checksummer, v4RequestSigner, payloadSigner);
298+
if (checksumAlgorithm != null) {
299+
String checksumHeaderName = checksumHeaderName(checksumAlgorithm);
300+
return request.request().firstMatchingHeader(checksumHeaderName).isPresent();
301+
}
302+
303+
return false;
300304
}
301305

302-
@Override
303-
public CompletableFuture<AsyncSignedRequest> signAsync(AsyncSignRequest<? extends AwsCredentialsIdentity> request) {
304-
Checksummer checksummer = checksummer(request);
305-
V4Properties v4Properties = v4Properties(request);
306-
V4RequestSigner v4RequestSigner = v4RequestSigner(request, v4Properties);
307-
V4PayloadSigner payloadSigner = v4PayloadAsyncSigner(request, v4Properties);
306+
private static boolean useChunkEncoding(boolean payloadSigningEnabled, boolean chunkEncodingEnabled,
307+
boolean isTrailingOrFlexible) {
308308

309-
return doSign(request, checksummer, v4RequestSigner, payloadSigner);
309+
return (payloadSigningEnabled && chunkEncodingEnabled) || (chunkEncodingEnabled && isTrailingOrFlexible);
310310
}
311311
}

core/http-auth-aws/src/main/java/software/amazon/awssdk/http/auth/aws/internal/signer/V4Context.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@
1515

1616
package software.amazon.awssdk.http.auth.aws.internal.signer;
1717

18-
import software.amazon.awssdk.annotations.Immutable;
1918
import software.amazon.awssdk.annotations.SdkInternalApi;
2019
import software.amazon.awssdk.http.SdkHttpRequest;
2120

2221
/**
2322
* A container for data produced during and as a result of the SigV4 request signing process.
2423
*/
2524
@SdkInternalApi
26-
@Immutable
25+
// TODO(sra-identity-auth): This is currently not @Immutable because signedRequest is a Builder. Is Builder needed? If it could
26+
// hold reference to SdkHttpRequest instead, this class would be @Immutable.
27+
// TODO(sra-identity-auth): Consider if we can rename this to convey something more. maybe,
28+
// V4RequestSigningResult/V4RequestSigningResultData? Note there is V4aContext similarly.
2729
public final class V4Context {
2830
private final String contentHash;
2931
private final byte[] signingKey;

core/http-auth-aws/src/test/java/software/amazon/awssdk/http/auth/aws/internal/signer/AwsChunkedV4PayloadSignerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,8 @@ public void sign_withoutContentLength_calculatesContentLengthFromPayload() throw
362362
"x-amz-checksum-sha256:oVyCkrHRKru75BSGBfeHL732RWGP7lqw6AcqezTxVeI=\r\n\r\n";
363363

364364
requestBuilder.putHeader("x-amz-content-sha256", "STREAMING-UNSIGNED-PAYLOAD-TRAILER");
365+
requestBuilder.removeHeader(Header.CONTENT_LENGTH);
366+
365367
V4CanonicalRequest canonicalRequest = new V4CanonicalRequest(
366368
requestBuilder.build(),
367369
"STREAMING-UNSIGNED-PAYLOAD-TRAILER",
@@ -380,7 +382,6 @@ public void sign_withoutContentLength_calculatesContentLengthFromPayload() throw
380382
.checksumAlgorithm(SHA256)
381383
.build();
382384

383-
v4Context.getSignedRequest().removeHeader(Header.CONTENT_LENGTH);
384385
signer.beforeSigning(requestBuilder, payload);
385386
ContentStreamProvider signedPayload = signer.sign(payload, v4Context);
386387

0 commit comments

Comments
 (0)