-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathHttpClientLogger.go
167 lines (122 loc) · 4.42 KB
/
HttpClientLogger.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
// © 2016-2024 Graylog, Inc.
package logger
import (
"io"
"net/http"
"net/url"
"time"
)
// NetHttpClientLogger defines a struct used to log specifically from the client side of API interactions using the net/http package.
type NetHttpClientLogger struct {
http.Client
HttpLogger *HttpLogger
}
// NewNetHttpClientLoggerOptions() takes 1 argument of type logger.Options and returns 2 objects; a pointer to an instance of an NetHttpClientLogger struct and an error.
// The NetHttpClientLogger returned by this function has the given options applied.
// If there is no error, the error value returned will be nil.
func NewNetHttpClientLoggerOptions(options Options) (*NetHttpClientLogger, error) {
HttpLogger, err := NewHttpLogger(options)
if err != nil {
return nil, err
}
return &NetHttpClientLogger{
HttpLogger: HttpLogger,
}, nil
}
// NewNetHttpClientLogger() takes no arguments and returns 2 objects; a pointer to an instance of an NetHttpClientLogger struct and an error.
// The NetHttpClientLogger returned by this function has the default options applied.
// If there is no error, the error value returned will be nil.
func NewNetHttpClientLogger() (*NetHttpClientLogger, error) {
options := Options{}
HttpLogger, err := NewHttpLogger(options)
if err != nil {
return nil, err
}
return &NetHttpClientLogger{
HttpLogger: HttpLogger,
}, nil
}
func (logger *NetHttpClientLogger) Logger() *HttpLogger {
return logger.HttpLogger
}
// net.http.Client.CloseIdleConnections() wrapper
func (clientLogger *NetHttpClientLogger) CloseIdleConnections() {
clientLogger.Client.CloseIdleConnections()
}
// net.http.Client.Do wrapper with logging
func (clientLogger *NetHttpClientLogger) Do(req *http.Request) (resp *http.Response, err error) {
// start time for logging interval
logger := clientLogger.HttpLogger
now := time.Now()
// capture the response or error
resp, err = clientLogger.Client.Do(req)
interval := time.Since(now).Milliseconds()
if err != nil {
return resp, err
}
// send logging message
SendHttpMessage(logger, resp, resp.Request, now.Unix()*int64(time.Millisecond), interval, nil)
return resp, err
}
// net.http.Client.Get wrapper with logging
func (clientLogger *NetHttpClientLogger) Get(url string) (resp *http.Response, err error) {
// start time for logging interval
logger := clientLogger.HttpLogger
now := time.Now()
// capture the response or error
// Devin 03/31/2021
// Something happens here with the .Get where err does return an error = "unsupported protocol scheme"
resp, err = clientLogger.Client.Get(url)
interval := time.Since(now).Milliseconds()
if err != nil {
return resp, err
}
// send logging message
SendHttpMessage(logger, resp, resp.Request, now.Unix()*int64(time.Millisecond), interval, nil)
return resp, err
}
// net.http.Client.Head wrapper with logging
func (clientLogger *NetHttpClientLogger) Head(url string) (resp *http.Response, err error) {
// start time for logging interval
logger := clientLogger.HttpLogger
now := time.Now()
// capture the response or error
resp, err = clientLogger.Client.Head(url)
interval := time.Since(now).Milliseconds()
if err != nil {
return resp, err
}
// send logging message
SendHttpMessage(logger, resp, resp.Request, now.Unix()*int64(time.Millisecond), interval, nil)
return resp, err
}
// net.http.Client.Post wrapper with logging
func (clientLogger *NetHttpClientLogger) Post(url string, contentType string, body io.Reader) (resp *http.Response, err error) {
// start time for logging interval
logger := clientLogger.HttpLogger
now := time.Now()
// capture the response or error
resp, err = clientLogger.Client.Post(url, contentType, body)
interval := time.Since(now).Milliseconds()
if err != nil {
return resp, err
}
// send logging message
SendHttpMessage(logger, resp, resp.Request, now.Unix()*int64(time.Millisecond), interval, nil)
return resp, err
}
// net.http.Client.PostForm wrapper with logging
func (clientLogger *NetHttpClientLogger) PostForm(url string, data url.Values) (resp *http.Response, err error) {
// start time for logging interval
logger := clientLogger.HttpLogger
now := time.Now()
// capture the response or error
resp, err = clientLogger.Client.PostForm(url, data)
interval := time.Since(now).Milliseconds()
if err != nil {
return resp, err
}
// send logging message
SendHttpMessage(logger, resp, resp.Request, now.Unix()*int64(time.Millisecond), interval, nil)
return resp, err
}