/
http_log_round_tripper.go
48 lines (40 loc) · 1.21 KB
/
http_log_round_tripper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package debugutil
import (
"net/http"
"net/http/httputil"
)
type logger interface {
Errorf(format string, v ...interface{})
Infof(format string, v ...interface{})
}
type LogRoundTripper struct {
http.RoundTripper
logger logger
dumpBody bool
}
// RoundTripper returns a new http.RoundTripper which logs all requests (request and response dump).
// Should only be used for none production envs.
func NewLogRoundTripper(roundTripper http.RoundTripper, logger logger, dumpBody bool) http.RoundTripper {
return LogRoundTripper{roundTripper, logger, dumpBody}
}
func (tr LogRoundTripper) RoundTrip(req *http.Request) (res *http.Response, err error) {
requestDump, err := httputil.DumpRequestOut(req, tr.dumpBody)
if err != nil {
tr.logger.Errorf("could not dump request: %v", err)
} else {
tr.logger.Infof("------------ HTTP REQUEST -----------\n%s", requestDump)
}
res, err = tr.RoundTripper.RoundTrip(req)
if err != nil {
return res, err
}
if res != nil {
responseDump, err := httputil.DumpResponse(res, tr.dumpBody)
if err != nil {
tr.logger.Errorf("could not dump response: %v", err)
} else {
tr.logger.Infof("------------ HTTP RESPONSE ----------\n%s", responseDump)
}
}
return res, err
}