1package smithy
2
3import (
4 "context"
5 "fmt"
6
7 v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
8 internalcontext "github.com/aws/aws-sdk-go-v2/internal/context"
9 "github.com/aws/aws-sdk-go-v2/internal/sdk"
10 "github.com/aws/smithy-go"
11 "github.com/aws/smithy-go/auth"
12 "github.com/aws/smithy-go/logging"
13 smithyhttp "github.com/aws/smithy-go/transport/http"
14)
15
16// V4SignerAdapter adapts v4.HTTPSigner to smithy http.Signer.
17type V4SignerAdapter struct {
18 Signer v4.HTTPSigner
19 Logger logging.Logger
20 LogSigning bool
21}
22
23var _ (smithyhttp.Signer) = (*V4SignerAdapter)(nil)
24
25// SignRequest signs the request with the provided identity.
26func (v *V4SignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, props smithy.Properties) error {
27 ca, ok := identity.(*CredentialsAdapter)
28 if !ok {
29 return fmt.Errorf("unexpected identity type: %T", identity)
30 }
31
32 name, ok := smithyhttp.GetSigV4SigningName(&props)
33 if !ok {
34 return fmt.Errorf("sigv4 signing name is required")
35 }
36
37 region, ok := smithyhttp.GetSigV4SigningRegion(&props)
38 if !ok {
39 return fmt.Errorf("sigv4 signing region is required")
40 }
41
42 hash := v4.GetPayloadHash(ctx)
43 signingTime := sdk.NowTime()
44 skew := internalcontext.GetAttemptSkewContext(ctx)
45 signingTime = signingTime.Add(skew)
46 err := v.Signer.SignHTTP(ctx, ca.Credentials, r.Request, hash, name, region, signingTime, func(o *v4.SignerOptions) {
47 o.DisableURIPathEscaping, _ = smithyhttp.GetDisableDoubleEncoding(&props)
48
49 o.Logger = v.Logger
50 o.LogSigning = v.LogSigning
51 })
52 if err != nil {
53 return fmt.Errorf("sign http: %w", err)
54 }
55
56 return nil
57}