src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

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 }