Skip to content

Commit 0f8ad11

Browse files
authored
Fix SRA auth trailing checksum retry bug (#2438)
1 parent efbc5aa commit 0f8ad11

30 files changed

+325
-16
lines changed

aws/retry/middleware.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -328,10 +328,12 @@ func AddRetryMiddlewares(stack *smithymiddle.Stack, options AddRetryMiddlewaresO
328328
middleware.LogAttempts = options.LogRetryAttempts
329329
})
330330

331-
if err := stack.Finalize.Add(attempt, smithymiddle.After); err != nil {
331+
// index retry to before signing, if signing exists
332+
if err := stack.Finalize.Insert(attempt, "Signing", smithymiddle.Before); err != nil {
332333
return err
333334
}
334-
if err := stack.Finalize.Add(&MetricsHeader{}, smithymiddle.After); err != nil {
335+
336+
if err := stack.Finalize.Insert(&MetricsHeader{}, attempt.ID(), smithymiddle.After); err != nil {
335337
return err
336338
}
337339
return nil

codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/AwsHttpPresignURLClientGenerator.java

+8
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,14 @@ private void writeConvertToPresignMiddleware(
375375
if _, ok := stack.Finalize.Get(($1P)(nil).ID()); ok {
376376
stack.Finalize.Remove(($1P)(nil).ID())
377377
}""", SdkGoTypes.ServiceInternal.AcceptEncoding.DisableGzip);
378+
writer.write("""
379+
if _, ok := stack.Finalize.Get(($1P)(nil).ID()); ok {
380+
stack.Finalize.Remove(($1P)(nil).ID())
381+
}""", SdkGoTypes.Aws.Retry.Attempt);
382+
writer.write("""
383+
if _, ok := stack.Finalize.Get(($1P)(nil).ID()); ok {
384+
stack.Finalize.Remove(($1P)(nil).ID())
385+
}""", SdkGoTypes.Aws.Retry.MetricsHeader);
378386
writer.write("stack.Deserialize.Clear()");
379387
writer.write("stack.Build.Remove(($P)(nil).ID())", requestInvocationID);
380388
writer.write("stack.Build.Remove($S)", "UserAgent");

codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/SdkGoTypes.java

+7
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,20 @@ public static final class Aws {
3434
public static final Symbol IsCredentialsProvider = AwsGoDependency.AWS_CORE.valueSymbol("IsCredentialsProvider");
3535
public static final Symbol AnonymousCredentials = AwsGoDependency.AWS_CORE.pointableSymbol("AnonymousCredentials");
3636

37+
3738
public static final class Middleware {
3839
public static final Symbol GetRequiresLegacyEndpoints = AwsGoDependency.AWS_MIDDLEWARE.valueSymbol("GetRequiresLegacyEndpoints");
3940
public static final Symbol GetSigningName = AwsGoDependency.AWS_MIDDLEWARE.valueSymbol("GetSigningName");
4041
public static final Symbol GetSigningRegion = AwsGoDependency.AWS_MIDDLEWARE.valueSymbol("GetSigningRegion");
4142
public static final Symbol SetSigningName = AwsGoDependency.AWS_MIDDLEWARE.valueSymbol("SetSigningName");
4243
public static final Symbol SetSigningRegion = AwsGoDependency.AWS_MIDDLEWARE.valueSymbol("SetSigningRegion");
4344
}
45+
46+
47+
public static final class Retry {
48+
public static final Symbol Attempt = AwsGoDependency.AWS_RETRY.pointableSymbol("Attempt");
49+
public static final Symbol MetricsHeader = AwsGoDependency.AWS_RETRY.pointableSymbol("MetricsHeader");
50+
}
4451
}
4552

4653
public static final class Internal {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package client
2+
3+
import (
4+
"context"
5+
"github.com/aws/smithy-go/middleware"
6+
)
7+
8+
type getIdentityMiddleware struct {
9+
options Options
10+
}
11+
12+
func (*getIdentityMiddleware) ID() string {
13+
return "GetIdentity"
14+
}
15+
16+
func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
17+
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
18+
) {
19+
return next.HandleFinalize(ctx, in)
20+
}
21+
22+
type signRequestMiddleware struct {
23+
}
24+
25+
func (*signRequestMiddleware) ID() string {
26+
return "Signing"
27+
}
28+
29+
func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
30+
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
31+
) {
32+
return next.HandleFinalize(ctx, in)
33+
}
34+
35+
type resolveAuthSchemeMiddleware struct {
36+
operation string
37+
options Options
38+
}
39+
40+
func (*resolveAuthSchemeMiddleware) ID() string {
41+
return "ResolveAuthScheme"
42+
}
43+
44+
func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
45+
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
46+
) {
47+
return next.HandleFinalize(ctx, in)
48+
}

credentials/endpointcreds/internal/client/client.go

+1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ func (c *Client) GetCredentials(ctx context.Context, params *GetCredentialsInput
101101
stack.Serialize.Add(&serializeOpGetCredential{}, smithymiddleware.After)
102102
stack.Build.Add(&buildEndpoint{Endpoint: options.Endpoint}, smithymiddleware.After)
103103
stack.Deserialize.Add(&deserializeOpGetCredential{}, smithymiddleware.After)
104+
addProtocolFinalizerMiddlewares(stack, options, "GetCredentials")
104105
retry.AddRetryMiddlewares(stack, retry.AddRetryMiddlewaresOptions{Retryer: options.Retryer})
105106
middleware.AddSDKAgentKey(middleware.FeatureMetadata, ServiceID)
106107
smithyhttp.AddErrorCloseResponseBodyMiddleware(stack)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package client
2+
3+
import (
4+
"context"
5+
"github.com/aws/smithy-go/middleware"
6+
)
7+
8+
type resolveEndpointV2Middleware struct {
9+
options Options
10+
}
11+
12+
func (*resolveEndpointV2Middleware) ID() string {
13+
return "ResolveEndpointV2"
14+
}
15+
16+
func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
17+
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
18+
) {
19+
return next.HandleFinalize(ctx, in)
20+
}

credentials/endpointcreds/internal/client/middleware.go

+16
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,19 @@ func stof(code int) smithy.ErrorFault {
146146
}
147147
return smithy.FaultClient
148148
}
149+
150+
func addProtocolFinalizerMiddlewares(stack *smithymiddleware.Stack, options Options, operation string) error {
151+
if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, smithymiddleware.Before); err != nil {
152+
return fmt.Errorf("add ResolveAuthScheme: %w", err)
153+
}
154+
if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", smithymiddleware.After); err != nil {
155+
return fmt.Errorf("add GetIdentity: %w", err)
156+
}
157+
if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", smithymiddleware.After); err != nil {
158+
return fmt.Errorf("add ResolveEndpointV2: %w", err)
159+
}
160+
if err := stack.Finalize.Insert(&signRequestMiddleware{}, "ResolveEndpointV2", smithymiddleware.After); err != nil {
161+
return fmt.Errorf("add Signing: %w", err)
162+
}
163+
return nil
164+
}

feature/ec2/imds/api_op_GetDynamicData.go

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type GetDynamicDataOutput struct {
5656
func addGetDynamicDataMiddleware(stack *middleware.Stack, options Options) error {
5757
return addAPIRequestMiddleware(stack,
5858
options,
59+
"GetDynamicData",
5960
buildGetDynamicDataPath,
6061
buildGetDynamicDataOutput)
6162
}

feature/ec2/imds/api_op_GetIAMInfo.go

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ type GetIAMInfoOutput struct {
5353
func addGetIAMInfoMiddleware(stack *middleware.Stack, options Options) error {
5454
return addAPIRequestMiddleware(stack,
5555
options,
56+
"GetIAMInfo",
5657
buildGetIAMInfoPath,
5758
buildGetIAMInfoOutput,
5859
)

feature/ec2/imds/api_op_GetInstanceIdentityDocument.go

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ type GetInstanceIdentityDocumentOutput struct {
5454
func addGetInstanceIdentityDocumentMiddleware(stack *middleware.Stack, options Options) error {
5555
return addAPIRequestMiddleware(stack,
5656
options,
57+
"GetInstanceIdentityDocument",
5758
buildGetInstanceIdentityDocumentPath,
5859
buildGetInstanceIdentityDocumentOutput,
5960
)

feature/ec2/imds/api_op_GetMetadata.go

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type GetMetadataOutput struct {
5656
func addGetMetadataMiddleware(stack *middleware.Stack, options Options) error {
5757
return addAPIRequestMiddleware(stack,
5858
options,
59+
"GetMetadata",
5960
buildGetMetadataPath,
6061
buildGetMetadataOutput)
6162
}

feature/ec2/imds/api_op_GetRegion.go

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type GetRegionOutput struct {
4545
func addGetRegionMiddleware(stack *middleware.Stack, options Options) error {
4646
return addAPIRequestMiddleware(stack,
4747
options,
48+
"GetRegion",
4849
buildGetInstanceIdentityDocumentPath,
4950
buildGetRegionOutput,
5051
)

feature/ec2/imds/api_op_GetToken.go

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ func addGetTokenMiddleware(stack *middleware.Stack, options Options) error {
4949
err := addRequestMiddleware(stack,
5050
options,
5151
"PUT",
52+
"GetToken",
5253
buildGetTokenPath,
5354
buildGetTokenOutput)
5455
if err != nil {

feature/ec2/imds/api_op_GetUserData.go

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type GetUserDataOutput struct {
4545
func addGetUserDataMiddleware(stack *middleware.Stack, options Options) error {
4646
return addAPIRequestMiddleware(stack,
4747
options,
48+
"GetUserData",
4849
buildGetUserDataPath,
4950
buildGetUserDataOutput)
5051
}

feature/ec2/imds/auth.go

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package imds
2+
3+
import (
4+
"context"
5+
"github.com/aws/smithy-go/middleware"
6+
)
7+
8+
type getIdentityMiddleware struct {
9+
options Options
10+
}
11+
12+
func (*getIdentityMiddleware) ID() string {
13+
return "GetIdentity"
14+
}
15+
16+
func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
17+
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
18+
) {
19+
return next.HandleFinalize(ctx, in)
20+
}
21+
22+
type signRequestMiddleware struct {
23+
}
24+
25+
func (*signRequestMiddleware) ID() string {
26+
return "Signing"
27+
}
28+
29+
func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
30+
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
31+
) {
32+
return next.HandleFinalize(ctx, in)
33+
}
34+
35+
type resolveAuthSchemeMiddleware struct {
36+
operation string
37+
options Options
38+
}
39+
40+
func (*resolveAuthSchemeMiddleware) ID() string {
41+
return "ResolveAuthScheme"
42+
}
43+
44+
func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
45+
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
46+
) {
47+
return next.HandleFinalize(ctx, in)
48+
}

feature/ec2/imds/endpoints.go

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package imds
2+
3+
import (
4+
"context"
5+
"github.com/aws/smithy-go/middleware"
6+
)
7+
8+
type resolveEndpointV2Middleware struct {
9+
options Options
10+
}
11+
12+
func (*resolveEndpointV2Middleware) ID() string {
13+
return "ResolveEndpointV2"
14+
}
15+
16+
func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
17+
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
18+
) {
19+
return next.HandleFinalize(ctx, in)
20+
}

feature/ec2/imds/request_middleware.go

+23-1
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ import (
1717

1818
func addAPIRequestMiddleware(stack *middleware.Stack,
1919
options Options,
20+
operation string,
2021
getPath func(interface{}) (string, error),
2122
getOutput func(*smithyhttp.Response) (interface{}, error),
2223
) (err error) {
23-
err = addRequestMiddleware(stack, options, "GET", getPath, getOutput)
24+
err = addRequestMiddleware(stack, options, "GET", operation, getPath, getOutput)
2425
if err != nil {
2526
return err
2627
}
@@ -44,6 +45,7 @@ func addAPIRequestMiddleware(stack *middleware.Stack,
4445
func addRequestMiddleware(stack *middleware.Stack,
4546
options Options,
4647
method string,
48+
operation string,
4749
getPath func(interface{}) (string, error),
4850
getOutput func(*smithyhttp.Response) (interface{}, error),
4951
) (err error) {
@@ -101,6 +103,10 @@ func addRequestMiddleware(stack *middleware.Stack,
101103
return err
102104
}
103105

106+
if err := addProtocolFinalizerMiddlewares(stack, options, operation); err != nil {
107+
return fmt.Errorf("add protocol finalizers: %w", err)
108+
}
109+
104110
// Retry support
105111
return retry.AddRetryMiddlewares(stack, retry.AddRetryMiddlewaresOptions{
106112
Retryer: options.Retryer,
@@ -283,3 +289,19 @@ func appendURIPath(base, add string) string {
283289
}
284290
return reqPath
285291
}
292+
293+
func addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error {
294+
if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil {
295+
return fmt.Errorf("add ResolveAuthScheme: %w", err)
296+
}
297+
if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", middleware.After); err != nil {
298+
return fmt.Errorf("add GetIdentity: %w", err)
299+
}
300+
if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", middleware.After); err != nil {
301+
return fmt.Errorf("add ResolveEndpointV2: %w", err)
302+
}
303+
if err := stack.Finalize.Insert(&signRequestMiddleware{}, "ResolveEndpointV2", middleware.After); err != nil {
304+
return fmt.Errorf("add Signing: %w", err)
305+
}
306+
return nil
307+
}

feature/ec2/imds/request_middleware_test.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func TestAddRequestMiddleware(t *testing.T) {
3333
"api request": {
3434
AddMiddleware: func(stack *middleware.Stack, options Options) error {
3535
return addAPIRequestMiddleware(stack, options,
36+
"TestRequest",
3637
func(interface{}) (string, error) {
3738
return "/mockPath", nil
3839
},
@@ -53,9 +54,13 @@ func TestAddRequestMiddleware(t *testing.T) {
5354
"UserAgent",
5455
},
5556
ExpectFinalize: []string{
57+
"ResolveAuthScheme",
58+
"GetIdentity",
59+
"ResolveEndpointV2",
5660
"Retry",
5761
"APITokenProvider",
5862
"RetryMetricsHeader",
63+
"Signing",
5964
},
6065
ExpectDeserialize: []string{
6166
"APITokenProvider",
@@ -66,7 +71,7 @@ func TestAddRequestMiddleware(t *testing.T) {
6671

6772
"base request": {
6873
AddMiddleware: func(stack *middleware.Stack, options Options) error {
69-
return addRequestMiddleware(stack, options, "POST",
74+
return addRequestMiddleware(stack, options, "POST", "TestRequest",
7075
func(interface{}) (string, error) {
7176
return "/mockPath", nil
7277
},
@@ -87,8 +92,12 @@ func TestAddRequestMiddleware(t *testing.T) {
8792
"UserAgent",
8893
},
8994
ExpectFinalize: []string{
95+
"ResolveAuthScheme",
96+
"GetIdentity",
97+
"ResolveEndpointV2",
9098
"Retry",
9199
"RetryMetricsHeader",
100+
"Signing",
92101
},
93102
ExpectDeserialize: []string{
94103
"OperationDeserializer",
@@ -590,6 +599,7 @@ func TestRequestGetToken(t *testing.T) {
590599
func(stack *middleware.Stack, options Options) error {
591600
return addAPIRequestMiddleware(stack,
592601
client.options.Copy(),
602+
"TestRequest",
593603
func(interface{}) (string, error) {
594604
return "/latest/foo", nil
595605
},

service/docdb/api_client.go

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)