request_id_retriever.go

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