-
Notifications
You must be signed in to change notification settings - Fork 25
/
logger.go
135 lines (116 loc) · 3.49 KB
/
logger.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package azuretls
import (
"fmt"
http "github.com/Noooste/fhttp"
"github.com/fatih/color"
"net/url"
"regexp"
"strings"
"time"
)
// Log will print the request and response to the console
//
// uris (optional) is a list of uris to ignore,
// if ignore is empty, all uris will be logged
func (s *Session) Log(uris ...string) {
s.logging = true
s.loggingIgnore = make([]*regexp.Regexp, 0, len(uris))
for _, v := range uris {
s.loggingIgnore = append(s.loggingIgnore, regexp.MustCompile(
fmt.Sprintf(".*%s.*",
strings.ReplaceAll(
replaceNonAlphaNumeric(v), "*\\.", ".*\\.?",
),
),
))
}
}
// DisableLog will disable request and response logging
func (s *Session) DisableLog() {
s.logging = false
}
// EnableLog will enable request and response logging
func (s *Session) EnableLog() {
s.logging = true
}
// LogIgnore will check if the given uri is ignored from dumping
func (s *Session) LogIgnore(uri string) bool {
parsed, err := url.Parse(uri)
if err != nil {
return false
}
return s.urlMatch(parsed, s.loggingIgnore)
}
var colorMethodMap = map[string]*color.Color{
http.MethodGet: color.New(color.BgBlue, color.FgHiWhite),
http.MethodPost: color.New(color.BgHiBlue, color.FgHiWhite),
http.MethodPut: color.New(color.BgHiYellow, color.FgBlack),
http.MethodPatch: color.New(color.BgHiMagenta, color.FgHiWhite),
http.MethodDelete: color.New(color.BgHiRed, color.FgHiWhite),
http.MethodOptions: color.New(color.BgHiCyan, color.FgHiWhite),
http.MethodConnect: color.New(color.BgHiWhite, color.FgBlack),
}
func centerString(s string, width int) string {
if len(s) >= width {
return s
}
leftPadding := (width - len(s)) / 2
rightPadding := width - len(s) - leftPadding
return strings.Repeat(" ", leftPadding) + s + strings.Repeat(" ", rightPadding)
}
func (s *Session) logRequest(request *Request) {
if !s.logging || s.urlMatch(request.parsedUrl, s.loggingIgnore) {
return
}
fmt.Printf("[%s] %v |%s | %s | %25s | %#v\n",
color.CyanString("AZURETLS"),
request.startTime.Format("01/02/2006 - 15:04:05"),
colorMethodMap[request.Method].Sprintf(" %-8s", request.Method),
centerString(request.Proto, 8),
request.parsedUrl.Host,
request.parsedUrl.Path,
)
}
func getColorStatus(status int) *color.Color {
switch {
case status < 200:
return color.New(color.BgHiCyan, color.FgHiWhite)
case status < 300:
return color.New(color.BgHiGreen, color.FgHiWhite)
case status < 400:
return color.New(color.BgHiYellow, color.FgHiWhite)
default:
return color.New(color.BgHiRed, color.FgHiWhite)
}
}
func (s *Session) logResponse(response *Response, err error) {
if !s.logging || s.urlMatch(response.Request.parsedUrl, s.loggingIgnore) {
return
}
now := time.Now()
if err != nil {
fmt.Printf("[%s] %v | %s | %13v | %25s | %#v\n",
color.CyanString("AZURETLS"),
now.Format("01/02/2006 - 15:04:05"),
color.New(color.BgRed, color.FgBlack).Sprint(err),
now.Sub(response.Request.startTime),
response.Request.parsedUrl.Host,
response.Request.parsedUrl.Path,
)
return
}
fmt.Printf("[%s] %v |%s| %13v | %25s | %#v\n",
color.CyanString("AZURETLS"),
now.Format("01/02/2006 - 15:04:05"),
getColorStatus(response.StatusCode).Sprintf(" %3d ", response.StatusCode),
now.Sub(response.Request.startTime),
response.Request.parsedUrl.Host,
response.Request.parsedUrl.Path,
)
}
// EnableVerbose enables verbose logging
//
// Deprecated: use Dump instead
func (s *Session) EnableVerbose(path string, ignoreHost []string) error {
return s.Dump(path, ignoreHost...)
}