request_id_retriever.go (1474B)
1 package middleware 2 3 import ( 4 "context" 5 6 "github.com/aws/smithy-go/middleware" 7 smithyhttp "github.com/aws/smithy-go/transport/http" 8 ) 9 10 // AddRequestIDRetrieverMiddleware adds request id retriever middleware 11 func AddRequestIDRetrieverMiddleware(stack *middleware.Stack) error { 12 // add error wrapper middleware before operation deserializers so that it can wrap the error response 13 // returned by operation deserializers 14 return stack.Deserialize.Insert(&requestIDRetriever{}, "OperationDeserializer", middleware.Before) 15 } 16 17 type requestIDRetriever struct { 18 } 19 20 // ID returns the middleware identifier 21 func (m *requestIDRetriever) ID() string { 22 return "RequestIDRetriever" 23 } 24 25 func (m *requestIDRetriever) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( 26 out middleware.DeserializeOutput, metadata middleware.Metadata, err error, 27 ) { 28 out, metadata, err = next.HandleDeserialize(ctx, in) 29 30 resp, ok := out.RawResponse.(*smithyhttp.Response) 31 if !ok { 32 // No raw response to wrap with. 33 return out, metadata, err 34 } 35 36 // Different header which can map to request id 37 requestIDHeaderList := []string{"X-Amzn-Requestid", "X-Amz-RequestId"} 38 39 for _, h := range requestIDHeaderList { 40 // check for headers known to contain Request id 41 if v := resp.Header.Get(h); len(v) != 0 { 42 // set reqID on metadata for successful responses. 43 SetRequestIDMetadata(&metadata, v) 44 break 45 } 46 } 47 48 return out, metadata, err 49 }