code.dwrz.net

Go monorepo.
Log | Files | Refs

request_id_retriever.go (1474B)


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