Skip to content

Commit 77e01ba

Browse files
authored
Add log round tripper (#49)
* Add log round tripper * fix dump body bool in constructor
1 parent 1df12e5 commit 77e01ba

File tree

3 files changed

+126
-3
lines changed

3 files changed

+126
-3
lines changed

debugutil/README.md

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
PrettySprint creates a human readable representation of the value v.
44

5-
## Example
5+
#### Example
66
```go
77
package main
88

@@ -18,7 +18,7 @@ func main() {
1818

1919
PrettyResponseDump creates a human readable representation of the value http.Response.
2020

21-
## Example
21+
#### Example
2222

2323
```go
2424
package main
@@ -42,7 +42,7 @@ func main() {
4242

4343
PrettyRequestDump creates a human readable representation of the value http.Request.
4444

45-
## Example
45+
#### Example
4646

4747
```go
4848
package main
@@ -62,4 +62,34 @@ func main() {
6262
}
6363
log.Println(s)
6464
}
65+
```
66+
67+
LogRoundTripper which logs all requests (request and response dump)
68+
69+
#### Example
70+
71+
```go
72+
package main
73+
74+
import (
75+
"github.com/donutloop/toolkit/debugutil"
76+
"net/http"
77+
)
78+
79+
type logger struct {}
80+
81+
func (l logger) Errorf(format string, v ...interface{}) {
82+
log.Println(fmt.Sprintf(format, v...))
83+
}
84+
func (l logger) Infof(format string, v ...interface{}) {
85+
log.Println(fmt.Sprintf(format, v...))
86+
}
87+
88+
func main() {
89+
90+
httpClient := new(http.Client)
91+
httpClient.Transport = debugutil.NewLogRoundTripper(http.DefaultTransport, logger{}, true)
92+
93+
response, err := httpClient.Get(server.URL)
94+
}
6595
```
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package debugutil
2+
3+
import (
4+
"net/http"
5+
"net/http/httputil"
6+
)
7+
8+
type logger interface {
9+
Errorf(format string, v ...interface{})
10+
Infof(format string, v ...interface{})
11+
}
12+
13+
type LogRoundTripper struct {
14+
http.RoundTripper
15+
logger logger
16+
dumpBody bool
17+
}
18+
19+
// RoundTripper returns a new http.RoundTripper which logs all requests (request and response dump)
20+
// Should only be used for none production envs
21+
func NewLogRoundTripper(roundTripper http.RoundTripper, logger logger, dumpBody bool) http.RoundTripper {
22+
return LogRoundTripper{roundTripper, logger, dumpBody}
23+
}
24+
25+
func (tr LogRoundTripper) RoundTrip(req *http.Request) (res *http.Response, err error) {
26+
requestDump, err := httputil.DumpRequestOut(req, tr.dumpBody)
27+
if err != nil {
28+
tr.logger.Errorf("could not dump request: %v", err)
29+
} else {
30+
tr.logger.Infof("------------ HTTP REQUEST -----------\n%s", requestDump)
31+
}
32+
33+
res, err = tr.RoundTripper.RoundTrip(req)
34+
if err != nil {
35+
return res, err
36+
}
37+
38+
if res != nil {
39+
responseDump, err := httputil.DumpResponse(res, tr.dumpBody)
40+
if err != nil {
41+
tr.logger.Errorf("could not dump response: %v", err)
42+
} else {
43+
tr.logger.Infof( "------------ HTTP RESPONSE ----------\n%s", responseDump)
44+
}
45+
}
46+
47+
return res, err
48+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package debugutil_test
2+
3+
import (
4+
"fmt"
5+
"github.com/donutloop/toolkit/debugutil"
6+
"log"
7+
"net/http"
8+
"net/http/httptest"
9+
"testing"
10+
)
11+
12+
type logger struct {}
13+
14+
func (l logger) Errorf(format string, v ...interface{}) {
15+
log.Println(fmt.Sprintf(format, v...))
16+
}
17+
func (l logger) Infof(format string, v ...interface{}) {
18+
log.Println(fmt.Sprintf(format, v...))
19+
}
20+
21+
func TestLogRoundTripper_RoundTrip(t *testing.T) {
22+
23+
handler := func(w http.ResponseWriter, r *http.Request) {
24+
w.WriteHeader(http.StatusOK)
25+
}
26+
27+
testHandler := http.HandlerFunc(handler)
28+
server := httptest.NewServer(testHandler)
29+
defer server.Close()
30+
31+
httpClient := new(http.Client)
32+
httpClient.Transport = debugutil.NewLogRoundTripper(http.DefaultTransport, logger{}, true)
33+
34+
response, err := httpClient.Get(server.URL)
35+
if err != nil {
36+
t.Fatalf("could not create request: %v", err)
37+
}
38+
39+
defer response.Body.Close()
40+
41+
if response.StatusCode != http.StatusOK {
42+
t.Fatal("response is bad, got: $v, want: $v", response.StatusCode, http.StatusOK)
43+
}
44+
}
45+

0 commit comments

Comments
 (0)