31
31
import software .amazon .awssdk .crt .auth .signing .AwsSigningConfig ;
32
32
import software .amazon .awssdk .http .ContentStreamProvider ;
33
33
import software .amazon .awssdk .http .SdkHttpFullRequest ;
34
+ import software .amazon .awssdk .regions .RegionScope ;
34
35
35
36
@ SdkInternalApi
36
37
public final class DefaultAwsCrtS3V4aSigner implements AwsCrtS3V4aSigner {
37
38
38
39
private final AwsCrt4aSigningAdapter signerAdapter ;
39
40
private final SigningConfigProvider configProvider ;
41
+ private final RegionScope defaultRegionScope ;
40
42
41
43
DefaultAwsCrtS3V4aSigner (AwsCrt4aSigningAdapter signerAdapter , SigningConfigProvider signingConfigProvider ) {
44
+ this (signerAdapter , signingConfigProvider , null );
45
+ }
46
+
47
+ DefaultAwsCrtS3V4aSigner (AwsCrt4aSigningAdapter signerAdapter , SigningConfigProvider signingConfigProvider ,
48
+ RegionScope defaultRegionScope ) {
42
49
this .signerAdapter = signerAdapter ;
43
50
this .configProvider = signingConfigProvider ;
51
+ this .defaultRegionScope = defaultRegionScope ;
52
+ }
53
+
54
+ private DefaultAwsCrtS3V4aSigner (BuilderImpl builder ) {
55
+ this (new AwsCrt4aSigningAdapter (), new SigningConfigProvider (), builder .defaultRegionScope );
44
56
}
45
57
46
58
public static AwsCrtS3V4aSigner create () {
47
- return new DefaultAwsCrtS3V4aSigner (new AwsCrt4aSigningAdapter (), new SigningConfigProvider ());
59
+ return builder ().build ();
60
+ }
61
+
62
+ public static Builder builder () {
63
+ return new BuilderImpl ();
48
64
}
49
65
50
66
@ Override
51
67
public SdkHttpFullRequest sign (SdkHttpFullRequest request , ExecutionAttributes executionAttributes ) {
52
68
if (credentialsAreAnonymous (executionAttributes )) {
53
69
return request ;
54
70
}
55
- AwsSigningConfig requestSigningConfig = configProvider .createS3CrtSigningConfig (executionAttributes );
56
- if (shouldSignPayload (request , executionAttributes )) {
71
+ ExecutionAttributes defaultsApplied = applyDefaults (executionAttributes );
72
+ AwsSigningConfig requestSigningConfig = configProvider .createS3CrtSigningConfig (defaultsApplied );
73
+ if (shouldSignPayload (request , defaultsApplied )) {
57
74
requestSigningConfig .setSignedBodyValue (AwsSigningConfig .AwsSignedBodyValue .STREAMING_AWS4_ECDSA_P256_SHA256_PAYLOAD );
58
75
SdkHttpFullRequest .Builder mutableRequest = request .toBuilder ();
59
76
setHeaderContentLength (mutableRequest );
60
77
SdkSigningResult signingResult = signerAdapter .sign (mutableRequest .build (), requestSigningConfig );
61
- AwsSigningConfig chunkConfig = configProvider .createChunkedSigningConfig (executionAttributes );
78
+ AwsSigningConfig chunkConfig = configProvider .createChunkedSigningConfig (defaultsApplied );
62
79
return enablePayloadSigning (signingResult , chunkConfig );
63
80
} else {
64
81
requestSigningConfig .setSignedBodyValue (AwsSigningConfig .AwsSignedBodyValue .UNSIGNED_PAYLOAD );
@@ -71,7 +88,8 @@ public SdkHttpFullRequest presign(SdkHttpFullRequest request, ExecutionAttribute
71
88
if (credentialsAreAnonymous (executionAttributes )) {
72
89
return request ;
73
90
}
74
- return signerAdapter .signRequest (request , configProvider .createS3CrtPresigningConfig (executionAttributes ));
91
+ ExecutionAttributes defaultsApplied = applyDefaults (executionAttributes );
92
+ return signerAdapter .signRequest (request , configProvider .createS3CrtPresigningConfig (defaultsApplied ));
75
93
}
76
94
77
95
private boolean credentialsAreAnonymous (ExecutionAttributes executionAttributes ) {
@@ -121,4 +139,38 @@ private boolean booleanValue(Boolean attribute) {
121
139
return Boolean .TRUE .equals (attribute );
122
140
}
123
141
142
+ /**
143
+ * Applies preconfigured defaults for values that are not present in {@code executionAttributes}.
144
+ */
145
+ private ExecutionAttributes applyDefaults (ExecutionAttributes executionAttributes ) {
146
+ return applyDefaultRegionScope (executionAttributes );
147
+ }
148
+
149
+ private ExecutionAttributes applyDefaultRegionScope (ExecutionAttributes executionAttributes ) {
150
+ if (executionAttributes .getAttribute (AwsSignerExecutionAttribute .SIGNING_REGION_SCOPE ) != null ) {
151
+ return executionAttributes ;
152
+ }
153
+
154
+ if (defaultRegionScope == null ) {
155
+ return executionAttributes ;
156
+ }
157
+
158
+ return executionAttributes .copy ()
159
+ .putAttribute (AwsSignerExecutionAttribute .SIGNING_REGION_SCOPE , defaultRegionScope );
160
+ }
161
+
162
+ private static class BuilderImpl implements Builder {
163
+ private RegionScope defaultRegionScope ;
164
+
165
+ @ Override
166
+ public Builder defaultRegionScope (RegionScope defaultRegionScope ) {
167
+ this .defaultRegionScope = defaultRegionScope ;
168
+ return this ;
169
+ }
170
+
171
+ @ Override
172
+ public AwsCrtS3V4aSigner build () {
173
+ return new DefaultAwsCrtS3V4aSigner (this );
174
+ }
175
+ }
124
176
}
0 commit comments