...
1 package http
2
3 import (
4 "context"
5 "fmt"
6 "net/http/httputil"
7
8 "github.com/aws/smithy-go/logging"
9 "github.com/aws/smithy-go/middleware"
10 )
11
12
13
14 type RequestResponseLogger struct {
15 LogRequest bool
16 LogRequestWithBody bool
17
18 LogResponse bool
19 LogResponseWithBody bool
20 }
21
22
23 func (r *RequestResponseLogger) ID() string {
24 return "RequestResponseLogger"
25 }
26
27
28 func (r *RequestResponseLogger) HandleDeserialize(
29 ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler,
30 ) (
31 out middleware.DeserializeOutput, metadata middleware.Metadata, err error,
32 ) {
33 logger := middleware.GetLogger(ctx)
34
35 if r.LogRequest || r.LogRequestWithBody {
36 smithyRequest, ok := in.Request.(*Request)
37 if !ok {
38 return out, metadata, fmt.Errorf("unknown transport type %T", in)
39 }
40
41 rc := smithyRequest.Build(ctx)
42 reqBytes, err := httputil.DumpRequestOut(rc, r.LogRequestWithBody)
43 if err != nil {
44 return out, metadata, err
45 }
46
47 logger.Logf(logging.Debug, "Request\n%v", string(reqBytes))
48
49 if r.LogRequestWithBody {
50 smithyRequest, err = smithyRequest.SetStream(rc.Body)
51 if err != nil {
52 return out, metadata, err
53 }
54 in.Request = smithyRequest
55 }
56 }
57
58 out, metadata, err = next.HandleDeserialize(ctx, in)
59
60 if (err == nil) && (r.LogResponse || r.LogResponseWithBody) {
61 smithyResponse, ok := out.RawResponse.(*Response)
62 if !ok {
63 return out, metadata, fmt.Errorf("unknown transport type %T", out.RawResponse)
64 }
65
66 respBytes, err := httputil.DumpResponse(smithyResponse.Response, r.LogResponseWithBody)
67 if err != nil {
68 return out, metadata, fmt.Errorf("failed to dump response %w", err)
69 }
70
71 logger.Logf(logging.Debug, "Response\n%v", string(respBytes))
72 }
73
74 return out, metadata, err
75 }
76
View as plain text