]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blame - vendor/github.com/aws/aws-sdk-go/aws/client/logger.go
deps: github.com/hashicorp/terraform@sdk-v0.11-with-go-modules
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / aws / aws-sdk-go / aws / client / logger.go
CommitLineData
9b12e4fe
JC
1package client
2
3import (
4 "bytes"
5 "fmt"
6 "io"
7 "io/ioutil"
8 "net/http/httputil"
9
10 "github.com/aws/aws-sdk-go/aws"
11 "github.com/aws/aws-sdk-go/aws/request"
12)
13
14const logReqMsg = `DEBUG: Request %s/%s Details:
15---[ REQUEST POST-SIGN ]-----------------------------
16%s
17-----------------------------------------------------`
18
19const logReqErrMsg = `DEBUG ERROR: Request %s/%s:
20---[ REQUEST DUMP ERROR ]-----------------------------
21%s
22------------------------------------------------------`
23
24type logWriter struct {
25 // Logger is what we will use to log the payload of a response.
26 Logger aws.Logger
27 // buf stores the contents of what has been read
28 buf *bytes.Buffer
29}
30
31func (logger *logWriter) Write(b []byte) (int, error) {
32 return logger.buf.Write(b)
33}
34
35type teeReaderCloser struct {
36 // io.Reader will be a tee reader that is used during logging.
37 // This structure will read from a body and write the contents to a logger.
38 io.Reader
39 // Source is used just to close when we are done reading.
40 Source io.ReadCloser
41}
42
43func (reader *teeReaderCloser) Close() error {
44 return reader.Source.Close()
45}
46
15c0b25d
AP
47// LogHTTPRequestHandler is a SDK request handler to log the HTTP request sent
48// to a service. Will include the HTTP request body if the LogLevel of the
49// request matches LogDebugWithHTTPBody.
50var LogHTTPRequestHandler = request.NamedHandler{
51 Name: "awssdk.client.LogRequest",
52 Fn: logRequest,
53}
54
9b12e4fe
JC
55func logRequest(r *request.Request) {
56 logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody)
15c0b25d
AP
57 bodySeekable := aws.IsReaderSeekable(r.Body)
58
59 b, err := httputil.DumpRequestOut(r.HTTPRequest, logBody)
9b12e4fe 60 if err != nil {
15c0b25d
AP
61 r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg,
62 r.ClientInfo.ServiceName, r.Operation.Name, err))
9b12e4fe
JC
63 return
64 }
65
66 if logBody {
15c0b25d
AP
67 if !bodySeekable {
68 r.SetReaderBody(aws.ReadSeekCloser(r.HTTPRequest.Body))
69 }
9b12e4fe
JC
70 // Reset the request body because dumpRequest will re-wrap the r.HTTPRequest's
71 // Body as a NoOpCloser and will not be reset after read by the HTTP
72 // client reader.
73 r.ResetBody()
74 }
75
15c0b25d
AP
76 r.Config.Logger.Log(fmt.Sprintf(logReqMsg,
77 r.ClientInfo.ServiceName, r.Operation.Name, string(b)))
78}
79
80// LogHTTPRequestHeaderHandler is a SDK request handler to log the HTTP request sent
81// to a service. Will only log the HTTP request's headers. The request payload
82// will not be read.
83var LogHTTPRequestHeaderHandler = request.NamedHandler{
84 Name: "awssdk.client.LogRequestHeader",
85 Fn: logRequestHeader,
86}
87
88func logRequestHeader(r *request.Request) {
89 b, err := httputil.DumpRequestOut(r.HTTPRequest, false)
90 if err != nil {
91 r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg,
92 r.ClientInfo.ServiceName, r.Operation.Name, err))
93 return
94 }
95
96 r.Config.Logger.Log(fmt.Sprintf(logReqMsg,
97 r.ClientInfo.ServiceName, r.Operation.Name, string(b)))
9b12e4fe
JC
98}
99
100const logRespMsg = `DEBUG: Response %s/%s Details:
101---[ RESPONSE ]--------------------------------------
102%s
103-----------------------------------------------------`
104
105const logRespErrMsg = `DEBUG ERROR: Response %s/%s:
106---[ RESPONSE DUMP ERROR ]-----------------------------
107%s
108-----------------------------------------------------`
109
15c0b25d
AP
110// LogHTTPResponseHandler is a SDK request handler to log the HTTP response
111// received from a service. Will include the HTTP response body if the LogLevel
112// of the request matches LogDebugWithHTTPBody.
113var LogHTTPResponseHandler = request.NamedHandler{
114 Name: "awssdk.client.LogResponse",
115 Fn: logResponse,
116}
117
9b12e4fe
JC
118func logResponse(r *request.Request) {
119 lw := &logWriter{r.Config.Logger, bytes.NewBuffer(nil)}
15c0b25d
AP
120
121 logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody)
122 if logBody {
123 r.HTTPResponse.Body = &teeReaderCloser{
124 Reader: io.TeeReader(r.HTTPResponse.Body, lw),
125 Source: r.HTTPResponse.Body,
126 }
9b12e4fe
JC
127 }
128
129 handlerFn := func(req *request.Request) {
15c0b25d 130 b, err := httputil.DumpResponse(req.HTTPResponse, false)
9b12e4fe 131 if err != nil {
15c0b25d
AP
132 lw.Logger.Log(fmt.Sprintf(logRespErrMsg,
133 req.ClientInfo.ServiceName, req.Operation.Name, err))
9b12e4fe
JC
134 return
135 }
136
15c0b25d
AP
137 lw.Logger.Log(fmt.Sprintf(logRespMsg,
138 req.ClientInfo.ServiceName, req.Operation.Name, string(b)))
139
140 if logBody {
141 b, err := ioutil.ReadAll(lw.buf)
142 if err != nil {
143 lw.Logger.Log(fmt.Sprintf(logRespErrMsg,
144 req.ClientInfo.ServiceName, req.Operation.Name, err))
145 return
146 }
147
9b12e4fe
JC
148 lw.Logger.Log(string(b))
149 }
150 }
151
152 const handlerName = "awsdk.client.LogResponse.ResponseBody"
153
154 r.Handlers.Unmarshal.SetBackNamed(request.NamedHandler{
155 Name: handlerName, Fn: handlerFn,
156 })
157 r.Handlers.UnmarshalError.SetBackNamed(request.NamedHandler{
158 Name: handlerName, Fn: handlerFn,
159 })
160}
15c0b25d
AP
161
162// LogHTTPResponseHeaderHandler is a SDK request handler to log the HTTP
163// response received from a service. Will only log the HTTP response's headers.
164// The response payload will not be read.
165var LogHTTPResponseHeaderHandler = request.NamedHandler{
166 Name: "awssdk.client.LogResponseHeader",
167 Fn: logResponseHeader,
168}
169
170func logResponseHeader(r *request.Request) {
171 if r.Config.Logger == nil {
172 return
173 }
174
175 b, err := httputil.DumpResponse(r.HTTPResponse, false)
176 if err != nil {
177 r.Config.Logger.Log(fmt.Sprintf(logRespErrMsg,
178 r.ClientInfo.ServiceName, r.Operation.Name, err))
179 return
180 }
181
182 r.Config.Logger.Log(fmt.Sprintf(logRespMsg,
183 r.ClientInfo.ServiceName, r.Operation.Name, string(b)))
184}