Skip to content

Commit baff246

Browse files
committed
Update codegen to automatically add chunked encoding signer property for streaming operations with http checksum trait
1 parent 7a78bfa commit baff246

File tree

25 files changed

+36502
-366
lines changed

25 files changed

+36502
-366
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,9 @@ private static List<SignerPropertyValueProvider> propertiesFromConstants(SigV4Si
196196
return properties;
197197
}
198198

199-
private static SignerPropertyValueProvider from(String name,
200-
Supplier<Object> valueSupplier,
201-
Class<? extends AwsV4FamilyHttpSigner> containingClass) {
199+
static SignerPropertyValueProvider from(String name,
200+
Supplier<Object> valueSupplier,
201+
Class<? extends AwsV4FamilyHttpSigner> containingClass) {
202202
return SignerPropertyValueProvider.builder()
203203
.containingClass(containingClass)
204204
.fieldName(name)

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

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,6 @@ private static SigV4SignerDefaults sigv4Default() {
8989
* <li>{@code payloadSigningEnabled(false)}
9090
* </ul>
9191
* <p>
92-
* Also overrides for the following operations
93-
*
94-
* <ul>
95-
* <li>{@code UploadParts} Sets the defaults and also {@code chunkEncodingEnabled(true)}</li>
96-
* <li>{@code PutObject} Sets the defaults and also {@code chunkEncodingEnabled(true)}</li>
97-
* </ul>
9892
*/
9993
private static SigV4SignerDefaults s3Defaults() {
10094
return sigv4Default()
@@ -104,26 +98,6 @@ private static SigV4SignerDefaults s3Defaults() {
10498
.doubleUrlEncode(Boolean.FALSE)
10599
.normalizePath(Boolean.FALSE)
106100
.payloadSigningEnabled(Boolean.FALSE)
107-
.putOperation("UploadPart",
108-
sigv4Default()
109-
.toBuilder()
110-
// Default S3 signer properties
111-
.doubleUrlEncode(Boolean.FALSE)
112-
.normalizePath(Boolean.FALSE)
113-
.payloadSigningEnabled(Boolean.FALSE)
114-
// Including chunkEncodingEnabled TRUE
115-
.chunkEncodingEnabled(Boolean.TRUE)
116-
.build())
117-
.putOperation("PutObject",
118-
sigv4Default()
119-
.toBuilder()
120-
// Default S3 signer properties
121-
.doubleUrlEncode(Boolean.FALSE)
122-
.normalizePath(Boolean.FALSE)
123-
.payloadSigningEnabled(Boolean.FALSE)
124-
// Including chunkEncodingEnabled TRUE
125-
.chunkEncodingEnabled(Boolean.TRUE)
126-
.build())
127101
.build();
128102
}
129103

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

Lines changed: 217 additions & 83 deletions
Large diffs are not rendered by default.

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

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515

1616
package software.amazon.awssdk.codegen.poet.auth.scheme;
1717

18-
import java.util.Collections;
19-
import java.util.HashMap;
20-
import java.util.Map;
2118
import java.util.Objects;
2219
import software.amazon.awssdk.utils.Validate;
2320

@@ -34,7 +31,6 @@ public final class SigV4SignerDefaults {
3431
private final Boolean normalizePath;
3532
private final Boolean payloadSigningEnabled;
3633
private final Boolean chunkEncodingEnabled;
37-
private final Map<String, SigV4SignerDefaults> operations;
3834

3935
private SigV4SignerDefaults(Builder builder) {
4036
this.service = builder.service;
@@ -44,7 +40,6 @@ private SigV4SignerDefaults(Builder builder) {
4440
this.normalizePath = builder.normalizePath;
4541
this.payloadSigningEnabled = builder.payloadSigningEnabled;
4642
this.chunkEncodingEnabled = builder.chunkEncodingEnabled;
47-
this.operations = Collections.unmodifiableMap(new HashMap<>(builder.operations));
4843
}
4944

5045
public boolean isServiceOverrideAuthScheme() {
@@ -79,10 +74,6 @@ public Boolean chunkEncodingEnabled() {
7974
return chunkEncodingEnabled;
8075
}
8176

82-
public Map<String, SigV4SignerDefaults> operations() {
83-
return operations;
84-
}
85-
8677
public Builder toBuilder() {
8778
return new Builder(this);
8879
}
@@ -119,7 +110,7 @@ public boolean equals(Object o) {
119110
if (!Objects.equals(chunkEncodingEnabled, defaults.chunkEncodingEnabled)) {
120111
return false;
121112
}
122-
return operations.equals(defaults.operations);
113+
return true;
123114
}
124115

125116
@Override
@@ -131,7 +122,6 @@ public int hashCode() {
131122
result = 31 * result + (normalizePath != null ? normalizePath.hashCode() : 0);
132123
result = 31 * result + (payloadSigningEnabled != null ? payloadSigningEnabled.hashCode() : 0);
133124
result = 31 * result + (chunkEncodingEnabled != null ? chunkEncodingEnabled.hashCode() : 0);
134-
result = 31 * result + operations.hashCode();
135125
return result;
136126
}
137127

@@ -148,8 +138,6 @@ public static class Builder {
148138
private Boolean payloadSigningEnabled;
149139
private Boolean chunkEncodingEnabled;
150140

151-
private Map<String, SigV4SignerDefaults> operations = new HashMap<>();
152-
153141
public Builder() {
154142
}
155143

@@ -161,7 +149,6 @@ public Builder(SigV4SignerDefaults other) {
161149
this.normalizePath = other.normalizePath;
162150
this.payloadSigningEnabled = other.payloadSigningEnabled;
163151
this.chunkEncodingEnabled = other.chunkEncodingEnabled;
164-
this.operations.putAll(other.operations);
165152
}
166153

167154
public String service() {
@@ -227,15 +214,6 @@ public Builder chunkEncodingEnabled(Boolean chunkEncodingEnabled) {
227214
return this;
228215
}
229216

230-
public Map<String, SigV4SignerDefaults> operations() {
231-
return operations;
232-
}
233-
234-
public Builder putOperation(String name, SigV4SignerDefaults constants) {
235-
this.operations.put(name, constants);
236-
return this;
237-
}
238-
239217
public SigV4SignerDefaults build() {
240218
return new SigV4SignerDefaults(this);
241219
}

codegen/src/test/java/software/amazon/awssdk/codegen/poet/ClientTestModels.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -439,16 +439,39 @@ public static IntermediateModel serviceWithH2UsePriorKnowledgeForH2() {
439439
return new IntermediateModelBuilder(models).build();
440440
}
441441

442-
public static IntermediateModel serviceMiniS3() {
442+
public static IntermediateModel serviceS3() {
443443
File serviceModel =
444-
new File(ClientTestModels.class.getResource("client/c2j/mini-s3/service-2.json").getFile());
444+
new File(ClientTestModels.class.getResource("client/c2j/s3-test/service-2.json").getFile());
445445
File customizationModel =
446-
new File(ClientTestModels.class.getResource("client/c2j/mini-s3/customization.config")
446+
new File(ClientTestModels.class.getResource("client/c2j/s3-test/customization.config")
447447
.getFile());
448+
File endpointRuleSet = new File(ClientTestModels.class.getResource("client/c2j/s3-test"
449+
+ "/endpoint-rule-set.json")
450+
.getFile());
448451
C2jModels models = C2jModels
449452
.builder()
450453
.serviceModel(getServiceModel(serviceModel))
451454
.customizationConfig(getCustomizationConfig(customizationModel))
455+
.endpointRuleSetModel(getEndpointRuleSet(endpointRuleSet))
456+
.build();
457+
458+
return new IntermediateModelBuilder(models).build();
459+
}
460+
461+
public static IntermediateModel serviceS3Control() {
462+
File serviceModel =
463+
new File(ClientTestModels.class.getResource("client/c2j/s3control-test/service-2.json").getFile());
464+
File customizationModel =
465+
new File(ClientTestModels.class.getResource("client/c2j/s3control-test/customization.config")
466+
.getFile());
467+
File endpointRuleSet = new File(ClientTestModels.class.getResource("client/c2j/s3control-test"
468+
+ "/endpoint-rule-set.json")
469+
.getFile());
470+
C2jModels models = C2jModels
471+
.builder()
472+
.serviceModel(getServiceModel(serviceModel))
473+
.customizationConfig(getCustomizationConfig(customizationModel))
474+
.endpointRuleSetModel(getEndpointRuleSet(endpointRuleSet))
452475
.build();
453476

454477
return new IntermediateModelBuilder(models).build();

codegen/src/test/java/software/amazon/awssdk/codegen/poet/auth/scheme/AuthSchemeSpecTest.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,24 @@ static List<TestCase> parameters() {
161161
.caseName("ops-with-no-auth")
162162
.outputFileSuffix("default-provider")
163163
.build(),
164-
// Service with signature version with the same value as S3
164+
// S3
165165
TestCase.builder()
166-
.modelProvider(ClientTestModels::serviceMiniS3)
166+
.modelProvider(ClientTestModels::serviceS3)
167+
.classSpecProvider(EndpointBasedAuthSchemeProviderSpec::new)
168+
.caseName("s3-test")
169+
.outputFileSuffix("default-provider")
170+
.build(),
171+
TestCase.builder()
172+
.modelProvider(ClientTestModels::serviceS3)
167173
.classSpecProvider(ModelBasedAuthSchemeProviderSpec::new)
168-
.caseName("mini-s3")
174+
.caseName("s3-test")
175+
.outputFileSuffix("fallback-provider")
176+
.build(),
177+
// S3 control
178+
TestCase.builder()
179+
.modelProvider(ClientTestModels::serviceS3Control)
180+
.classSpecProvider(ModelBasedAuthSchemeProviderSpec::new)
181+
.caseName("s3control-test")
169182
.outputFileSuffix("default-provider")
170183
.build(),
171184
TestCase.builder()
@@ -227,6 +240,13 @@ static List<TestCase> parameters() {
227240
.classSpecProvider(AuthSchemeInterceptorSpec::new)
228241
.caseName("env-bearer-token")
229242
.outputFileSuffix("interceptor")
243+
.build(),
244+
// Rest Json service with checksum
245+
TestCase.builder()
246+
.modelProvider(ClientTestModels::restJsonServiceModels)
247+
.classSpecProvider(ModelBasedAuthSchemeProviderSpec::new)
248+
.caseName("rest-json-checksum")
249+
.outputFileSuffix("provider")
230250
.build()
231251
);
232252
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package software.amazon.awssdk.services.json.auth.scheme.internal;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
import software.amazon.awssdk.annotations.Generated;
7+
import software.amazon.awssdk.annotations.SdkInternalApi;
8+
import software.amazon.awssdk.http.auth.aws.signer.AwsV4HttpSigner;
9+
import software.amazon.awssdk.http.auth.spi.scheme.AuthSchemeOption;
10+
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeParams;
11+
import software.amazon.awssdk.services.json.auth.scheme.JsonAuthSchemeProvider;
12+
13+
@Generated("software.amazon.awssdk:codegen")
14+
@SdkInternalApi
15+
public final class DefaultJsonAuthSchemeProvider implements JsonAuthSchemeProvider {
16+
private static final DefaultJsonAuthSchemeProvider DEFAULT = new DefaultJsonAuthSchemeProvider();
17+
18+
private DefaultJsonAuthSchemeProvider() {
19+
}
20+
21+
public static DefaultJsonAuthSchemeProvider create() {
22+
return DEFAULT;
23+
}
24+
25+
@Override
26+
public List<AuthSchemeOption> resolveAuthScheme(JsonAuthSchemeParams params) {
27+
List<AuthSchemeOption> options = new ArrayList<>();
28+
switch (params.operation()) {
29+
case "BearerAuthOperation":
30+
options.add(AuthSchemeOption.builder().schemeId("smithy.api#httpBearerAuth").build());
31+
break;
32+
case "StreamingInputOutputOperation":
33+
options.add(AuthSchemeOption.builder().schemeId("aws.auth#sigv4")
34+
.putSignerProperty(AwsV4HttpSigner.SERVICE_SIGNING_NAME, "json-service")
35+
.putSignerProperty(AwsV4HttpSigner.REGION_NAME, params.region().id())
36+
.putSignerProperty(AwsV4HttpSigner.PAYLOAD_SIGNING_ENABLED, false).build());
37+
break;
38+
case "PutOperationWithChecksum":
39+
options.add(AuthSchemeOption.builder().schemeId("aws.auth#sigv4")
40+
.putSignerProperty(AwsV4HttpSigner.SERVICE_SIGNING_NAME, "json-service")
41+
.putSignerProperty(AwsV4HttpSigner.REGION_NAME, params.region().id())
42+
.putSignerProperty(AwsV4HttpSigner.CHUNK_ENCODING_ENABLED, true).build());
43+
break;
44+
default:
45+
options.add(AuthSchemeOption.builder().schemeId("aws.auth#sigv4")
46+
.putSignerProperty(AwsV4HttpSigner.SERVICE_SIGNING_NAME, "json-service")
47+
.putSignerProperty(AwsV4HttpSigner.REGION_NAME, params.region().id()).build());
48+
break;
49+
}
50+
return Collections.unmodifiableList(options);
51+
}
52+
}

0 commit comments

Comments
 (0)