response_error_middleware.go (1712B)
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 // ResponseErrorWrapper wraps operation errors with ResponseError. 19 type ResponseErrorWrapper struct { 20 } 21 22 // ID returns the middleware identifier 23 func (m *ResponseErrorWrapper) ID() string { 24 return "ResponseErrorWrapper" 25 } 26 27 // HandleDeserialize wraps the stack error with smithyhttp.ResponseError. 28 func (m *ResponseErrorWrapper) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( 29 out middleware.DeserializeOutput, metadata middleware.Metadata, err error, 30 ) { 31 out, metadata, err = next.HandleDeserialize(ctx, in) 32 if err == nil { 33 // Nothing to do when there is no error. 34 return out, metadata, err 35 } 36 37 resp, ok := out.RawResponse.(*smithyhttp.Response) 38 if !ok { 39 // No raw response to wrap with. 40 return out, metadata, err 41 } 42 43 // look for request id in metadata 44 reqID, _ := awsmiddleware.GetRequestIDMetadata(metadata) 45 46 // Wrap the returned smithy error with the request id retrieved from the metadata 47 err = &ResponseError{ 48 ResponseError: &smithyhttp.ResponseError{ 49 Response: resp, 50 Err: err, 51 }, 52 RequestID: reqID, 53 } 54 55 return out, metadata, err 56 }