You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.5 KiB
55 lines
1.5 KiB
package http
|
|
|
|
import (
|
|
"context"
|
|
|
|
awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
|
|
"github.com/aws/smithy-go/middleware"
|
|
smithyhttp "github.com/aws/smithy-go/transport/http"
|
|
)
|
|
|
|
// AddResponseErrorMiddleware adds response error wrapper middleware
|
|
func AddResponseErrorMiddleware(stack *middleware.Stack) error {
|
|
// add error wrapper middleware before request id retriever middleware so that it can wrap the error response
|
|
// returned by operation deserializers
|
|
return stack.Deserialize.Insert(&responseErrorWrapper{}, "RequestIDRetriever", middleware.Before)
|
|
}
|
|
|
|
type responseErrorWrapper struct {
|
|
}
|
|
|
|
// ID returns the middleware identifier
|
|
func (m *responseErrorWrapper) ID() string {
|
|
return "ResponseErrorWrapper"
|
|
}
|
|
|
|
func (m *responseErrorWrapper) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (
|
|
out middleware.DeserializeOutput, metadata middleware.Metadata, err error,
|
|
) {
|
|
out, metadata, err = next.HandleDeserialize(ctx, in)
|
|
if err == nil {
|
|
// Nothing to do when there is no error.
|
|
return out, metadata, err
|
|
}
|
|
|
|
resp, ok := out.RawResponse.(*smithyhttp.Response)
|
|
if !ok {
|
|
// No raw response to wrap with.
|
|
return out, metadata, err
|
|
}
|
|
|
|
// look for request id in metadata
|
|
reqID, _ := awsmiddleware.GetRequestIDMetadata(metadata)
|
|
|
|
// Wrap the returned smithy error with the request id retrieved from the metadata
|
|
err = &ResponseError{
|
|
ResponseError: &smithyhttp.ResponseError{
|
|
Response: resp,
|
|
Err: err,
|
|
},
|
|
RequestID: reqID,
|
|
}
|
|
|
|
return out, metadata, err
|
|
}
|