v4signer_adapter_eventstream.go (1516B)
1 package smithy 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" 9 smithygo "github.com/aws/smithy-go" 10 "github.com/aws/smithy-go/auth" 11 "github.com/aws/smithy-go/eventstream" 12 smithyhttp "github.com/aws/smithy-go/transport/http" 13 ) 14 15 var _ smithyhttp.EventStreamSigner = (*V4SignerAdapter)(nil) 16 17 // NewMessageSigner implements [smithyhttp.EventStreamSigner]. 18 func (v *V4SignerAdapter) NewMessageSigner(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, props smithygo.Properties) (eventstream.MessageSigner, error) { 19 ca, ok := identity.(*CredentialsAdapter) 20 if !ok { 21 return nil, fmt.Errorf("unexpected identity type: %T", identity) 22 } 23 24 name, ok := smithyhttp.GetSigV4SigningName(&props) 25 if !ok { 26 return nil, fmt.Errorf("sigv4 signing name is required") 27 } 28 29 region, ok := smithyhttp.GetSigV4SigningRegion(&props) 30 if !ok { 31 return nil, fmt.Errorf("sigv4 signing region is required") 32 } 33 34 seed, err := v4.GetSignedRequestSignature(r.Request) 35 if err != nil { 36 return nil, fmt.Errorf("get seed signature: %w", err) 37 } 38 39 return &streamSignerAdapter{ 40 signer: v4.NewStreamSigner(ca.Credentials, name, region, seed), 41 }, nil 42 } 43 44 // streamSignerAdapter adapts v4.StreamSigner to eventstream.MessageSigner. 45 type streamSignerAdapter struct { 46 signer *v4.StreamSigner 47 } 48 49 func (s *streamSignerAdapter) SignMessage(headers, payload []byte, signingTime time.Time) ([]byte, error) { 50 return s.signer.GetSignature(context.Background(), headers, payload, signingTime) 51 }