middleware.go raw

   1  package middleware
   2  
   3  import (
   4  	"context"
   5  	"sync/atomic"
   6  	"time"
   7  
   8  	internalcontext "github.com/aws/aws-sdk-go-v2/internal/context"
   9  	"github.com/aws/smithy-go/middleware"
  10  )
  11  
  12  // AddTimeOffsetMiddleware sets a value representing clock skew on the request context.
  13  // This can be read by other operations (such as signing) to correct the date value they send
  14  // on the request
  15  type AddTimeOffsetMiddleware struct {
  16  	Offset *atomic.Int64
  17  }
  18  
  19  // ID the identifier for AddTimeOffsetMiddleware
  20  func (m *AddTimeOffsetMiddleware) ID() string { return "AddTimeOffsetMiddleware" }
  21  
  22  // HandleBuild sets a value for attemptSkew on the request context if one is set on the client.
  23  func (m AddTimeOffsetMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (
  24  	out middleware.BuildOutput, metadata middleware.Metadata, err error,
  25  ) {
  26  	if m.Offset != nil {
  27  		offset := time.Duration(m.Offset.Load())
  28  		ctx = internalcontext.SetAttemptSkewContext(ctx, offset)
  29  	}
  30  	return next.HandleBuild(ctx, in)
  31  }
  32  
  33  // HandleDeserialize gets the clock skew context from the context, and if set, sets it on the pointer
  34  // held by AddTimeOffsetMiddleware
  35  func (m *AddTimeOffsetMiddleware) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (
  36  	out middleware.DeserializeOutput, metadata middleware.Metadata, err error,
  37  ) {
  38  	if v := internalcontext.GetAttemptSkewContext(ctx); v != 0 {
  39  		m.Offset.Store(v.Nanoseconds())
  40  	}
  41  	return next.HandleDeserialize(ctx, in)
  42  }
  43