src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

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 }