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