request_id_retriever.go (1671B)
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 // RequestIDRetriever middleware captures the AWS service request ID from the 18 // raw response. 19 type RequestIDRetriever struct { 20 } 21 22 // ID returns the middleware identifier 23 func (m *RequestIDRetriever) ID() string { 24 return "RequestIDRetriever" 25 } 26 27 // HandleDeserialize pulls the AWS request ID from the response, storing it in 28 // operation metadata. 29 func (m *RequestIDRetriever) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( 30 out middleware.DeserializeOutput, metadata middleware.Metadata, err error, 31 ) { 32 out, metadata, err = next.HandleDeserialize(ctx, in) 33 34 resp, ok := out.RawResponse.(*smithyhttp.Response) 35 if !ok { 36 // No raw response to wrap with. 37 return out, metadata, err 38 } 39 40 // Different header which can map to request id 41 requestIDHeaderList := []string{"X-Amzn-Requestid", "X-Amz-RequestId"} 42 43 for _, h := range requestIDHeaderList { 44 // check for headers known to contain Request id 45 if v := resp.Header.Get(h); len(v) != 0 { 46 // set reqID on metadata for successful responses. 47 SetRequestIDMetadata(&metadata, v) 48 break 49 } 50 } 51 52 return out, metadata, err 53 }