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}