response_error_middleware.go (1571B)
1 package http 2 3 import ( 4 "context" 5 6 awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" 7 "github.com/aws/smithy-go/middleware" 8 smithyhttp "github.com/aws/smithy-go/transport/http" 9 ) 10 11 // AddResponseErrorMiddleware adds response error wrapper middleware 12 func AddResponseErrorMiddleware(stack *middleware.Stack) error { 13 // add error wrapper middleware before request id retriever middleware so that it can wrap the error response 14 // returned by operation deserializers 15 return stack.Deserialize.Insert(&responseErrorWrapper{}, "RequestIDRetriever", middleware.Before) 16 } 17 18 type responseErrorWrapper struct { 19 } 20 21 // ID returns the middleware identifier 22 func (m *responseErrorWrapper) ID() string { 23 return "ResponseErrorWrapper" 24 } 25 26 func (m *responseErrorWrapper) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( 27 out middleware.DeserializeOutput, metadata middleware.Metadata, err error, 28 ) { 29 out, metadata, err = next.HandleDeserialize(ctx, in) 30 if err == nil { 31 // Nothing to do when there is no error. 32 return out, metadata, err 33 } 34 35 resp, ok := out.RawResponse.(*smithyhttp.Response) 36 if !ok { 37 // No raw response to wrap with. 38 return out, metadata, err 39 } 40 41 // look for request id in metadata 42 reqID, _ := awsmiddleware.GetRequestIDMetadata(metadata) 43 44 // Wrap the returned smithy error with the request id retrieved from the metadata 45 err = &ResponseError{ 46 ResponseError: &smithyhttp.ResponseError{ 47 Response: resp, 48 Err: err, 49 }, 50 RequestID: reqID, 51 } 52 53 return out, metadata, err 54 }