Passed
Push — master ( 51a175...44e67e )
by eval
01:31
created

config/debug_http.go   A

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 14
eloc 54
dl 0
loc 89
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A config.*DebugTransport.transport 0 6 2
A config.*DebugTransport.RoundTrip 0 14 2
A config.*DebugTransport.showDumpRequest 0 15 5
A config.*DebugTransport.showDumpResponse 0 16 5
1
package config
2
3
import (
4
	"bytes"
5
	"context"
6
	"fmt"
7
	"io/ioutil"
8
	"math/rand"
9
	"net/http"
10
	"net/http/httputil"
11
	"time"
12
)
13
14
// These debugging codes are copeid and modified from https://github.com/motemen/go-loghttp
15
// Copyright (c) 2014 motemen
16
17
var _ http.RoundTripper = &DebugTransport{}
18
19
// DebugTransport implements http.RoundTripper and showing request/response contents.
20
type DebugTransport struct {
21
	Transport http.RoundTripper
22
}
23
24
var DefaultDebugTransport = &DebugTransport{
0 ignored issues
show
introduced by
exported var DefaultDebugTransport should have comment or be unexported
Loading history...
25
	Transport: http.DefaultTransport,
26
}
27
28
type contextKey struct{}
29
30
var contextKeyRequestStart = &contextKey{}
31
32
func (t *DebugTransport) RoundTrip(req *http.Request) (*http.Response, error) {
0 ignored issues
show
introduced by
exported method DebugTransport.RoundTrip should have comment or be unexported
Loading history...
33
	ctx := context.WithValue(req.Context(), contextKeyRequestStart, time.Now())
34
	req = req.WithContext(ctx)
35
36
	num := rand.Int63() // #nosec G404 | this number is used only for debugging and readability
37
	t.showDumpRequest(req, num)
38
39
	resp, err := t.transport().RoundTrip(req)
40
	if err != nil {
41
		return resp, err
42
	}
43
44
	t.showDumpResponse(resp, num)
45
	return resp, err
46
}
47
48
// showDumpRequest shows dumps of requests.
49
func (t *DebugTransport) showDumpRequest(req *http.Request, num int64) {
50
	if req == nil || req.Body == nil {
51
		return
52
	}
53
	body, err := ioutil.ReadAll(req.Body)
54
	if err != nil {
55
		return
56
	}
57
58
	req.Body = ioutil.NopCloser(bytes.NewReader(body))
59
	dump, err := httputil.DumpRequest(req, false)
60
	if err != nil {
61
		return
62
	}
63
	fmt.Printf("---- [[AWS Request (#%d)]] ----\n[[Request Header]]\n%s[[Request Body]]\n%s\n\n", num, string(dump), body)
64
}
65
66
func (t *DebugTransport) showDumpResponse(resp *http.Response, num int64) {
67
	if resp == nil || resp.Body == nil {
68
		return
69
	}
70
	body, err := ioutil.ReadAll(resp.Body)
71
	if err != nil {
72
		return
73
	}
74
	defer resp.Body.Close()
75
76
	resp.Body = ioutil.NopCloser(bytes.NewReader(body))
77
	dump, err := httputil.DumpResponse(resp, false)
78
	if err != nil {
79
		return
80
	}
81
	fmt.Printf("---- [[AWS Response (#%d)]] ----\n[[Response Header]]\n%s[[Response Body]]\n%s\n\n\n", num, string(dump), body)
82
}
83
84
func (t *DebugTransport) transport() http.RoundTripper {
85
	if t.Transport != nil {
86
		return t.Transport
87
	}
88
89
	return http.DefaultTransport
90
}
91