1 package httpretty
2
3 import (
4 "bytes"
5 "io"
6 "io/ioutil"
7 "net"
8 "net/http"
9 "net/url"
10 "os"
11 "reflect"
12 "testing"
13 "time"
14 )
15
16 func TestPrintRequest(t *testing.T) {
17 t.Parallel()
18
19 var req, err = http.NewRequest(http.MethodPost, "http://wxww.example.com/", nil)
20
21 if err != nil {
22 panic(err)
23 }
24
25 logger := &Logger{
26 TLS: true,
27 RequestHeader: true,
28 RequestBody: true,
29 ResponseHeader: true,
30 ResponseBody: true,
31 }
32
33 var buf bytes.Buffer
34 logger.SetOutput(&buf)
35
36 logger.PrintRequest(req)
37
38 want := `> POST / HTTP/1.1
39 > Host: wxww.example.com
40
41 `
42
43 if got := buf.String(); got != want {
44 t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
45 }
46 }
47
48 func TestPrintRequestWithColors(t *testing.T) {
49 t.Parallel()
50
51 var req, err = http.NewRequest(http.MethodPost, "http://wxww.example.com/", nil)
52
53 if err != nil {
54 panic(err)
55 }
56
57 logger := &Logger{
58 TLS: true,
59 RequestHeader: true,
60 RequestBody: true,
61 ResponseHeader: true,
62 ResponseBody: true,
63 Colors: true,
64 }
65
66 var buf bytes.Buffer
67 logger.SetOutput(&buf)
68
69 logger.PrintRequest(req)
70
71 want := "> \x1b[34;1mPOST\x1b[0m \x1b[33m/\x1b[0m \x1b[34mHTTP/1.1\x1b[0m" +
72 "\n> \x1b[34;1mHost\x1b[0m\x1b[31m:\x1b[0m \x1b[33mwxww.example.com\x1b[0m\n\n"
73
74 if got := buf.String(); got != want {
75 t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
76 }
77 }
78
79 func TestEncodingQueryStringParams(t *testing.T) {
80
81
82 t.Parallel()
83
84 qs := url.Values{}
85 qs.Set("a", "b")
86 qs.Set("i", "j")
87 qs.Set("x", "y")
88 qs.Set("z", "+=")
89 qs.Set("var", "foo&bar")
90 u := url.URL{
91 Scheme: "http",
92 Host: "www.example.com",
93 Path: "/mypath",
94 RawQuery: qs.Encode(),
95 }
96 var req, err = http.NewRequest(http.MethodPost, u.String(), nil)
97
98 if err != nil {
99 panic(err)
100 }
101
102 logger := &Logger{
103 TLS: true,
104 RequestHeader: true,
105 RequestBody: true,
106 ResponseHeader: true,
107 ResponseBody: true,
108 Colors: true,
109 }
110
111 var buf bytes.Buffer
112 logger.SetOutput(&buf)
113
114 logger.PrintRequest(req)
115
116 want := "> \x1b[34;1mPOST\x1b[0m \x1b[33m/mypath?a=b&i=j&var=foo%26bar&x=y&z=%2B%3D\x1b[0m \x1b[34mHTTP/1.1\x1b[0m" +
117 "\n> \x1b[34;1mHost\x1b[0m\x1b[31m:\x1b[0m \x1b[33mwww.example.com\x1b[0m\n\n"
118
119 if got := buf.String(); got != want {
120 t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
121 }
122 }
123
124 func TestEncodingQueryStringParamsNoColors(t *testing.T) {
125 t.Parallel()
126
127 qs := url.Values{}
128 qs.Set("a", "b")
129 qs.Set("i", "j")
130 qs.Set("x", "y")
131 qs.Set("z", "+=")
132 qs.Set("var", "foo&bar")
133 u := url.URL{
134 Scheme: "http",
135 Host: "www.example.com",
136 Path: "/mypath",
137 RawQuery: qs.Encode(),
138 }
139 var req, err = http.NewRequest(http.MethodPost, u.String(), nil)
140
141 if err != nil {
142 panic(err)
143 }
144
145 logger := &Logger{
146 TLS: true,
147 RequestHeader: true,
148 RequestBody: true,
149 ResponseHeader: true,
150 ResponseBody: true,
151 }
152
153 var buf bytes.Buffer
154 logger.SetOutput(&buf)
155
156 logger.PrintRequest(req)
157
158 want := `> POST /mypath?a=b&i=j&var=foo%26bar&x=y&z=%2B%3D HTTP/1.1
159 > Host: www.example.com
160
161 `
162
163 if got := buf.String(); got != want {
164 t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
165 }
166 }
167
168 func TestPrintRequestFiltered(t *testing.T) {
169 t.Parallel()
170
171 var req, err = http.NewRequest(http.MethodPost, "http://wxww.example.com/", nil)
172
173 if err != nil {
174 panic(err)
175 }
176
177 logger := &Logger{
178 TLS: true,
179 RequestHeader: true,
180 RequestBody: true,
181 ResponseHeader: true,
182 ResponseBody: true,
183 }
184
185 var buf bytes.Buffer
186 logger.SetOutput(&buf)
187 logger.SetFilter(func(req *http.Request) (skip bool, err error) {
188 return true, nil
189 })
190
191 logger.PrintRequest(req)
192
193 if got := buf.Len(); got != 0 {
194 t.Errorf("got %v from logger, wanted nothing (everything should be filtered)", got)
195 }
196 }
197
198 func TestPrintRequestNil(t *testing.T) {
199 t.Parallel()
200
201 logger := &Logger{
202 TLS: true,
203 RequestHeader: true,
204 RequestBody: true,
205 ResponseHeader: true,
206 ResponseBody: true,
207 }
208
209 var buf bytes.Buffer
210 logger.SetOutput(&buf)
211
212 logger.PrintRequest(nil)
213
214 want := "> error: null request\n"
215
216 if got := buf.String(); got != want {
217 t.Errorf("PrintRequest(req) = %v, wanted %v", got, want)
218 }
219 }
220
221 func TestPrintResponseNil(t *testing.T) {
222 t.Parallel()
223
224 logger := &Logger{
225 TLS: true,
226 RequestHeader: true,
227 RequestBody: true,
228 ResponseHeader: true,
229 ResponseBody: true,
230 }
231
232 var buf bytes.Buffer
233 logger.SetOutput(&buf)
234
235 logger.PrintResponse(nil)
236
237 want := "< error: null response\n"
238
239 if got := buf.String(); got != want {
240 t.Errorf("PrintResponse(req) = %v, wanted %v", got, want)
241 }
242 }
243
244 func testBody(t *testing.T, r io.Reader, want []byte) {
245 t.Helper()
246
247 got, err := ioutil.ReadAll(r)
248
249 if err != nil {
250 t.Errorf("expected no error reading response body, got %v instead", err)
251 }
252
253 if !reflect.DeepEqual(got, want) {
254 t.Errorf(`got body = %v, wanted %v`, string(got), string(want))
255 }
256 }
257
258 func TestJSONFormatterWriterError(t *testing.T) {
259
260 f := &JSONFormatter{}
261 want := "underlying writer for JSONFormatter must be *bytes.Buffer"
262 if err := f.Format(os.Stdout, []byte(`{}`)); err == nil || err.Error() != want {
263 t.Errorf("got format error = %v, wanted %v", err, want)
264 }
265 }
266
267
268
269
270
271 func newTransport() *http.Transport {
272
273 return &http.Transport{
274 Proxy: http.ProxyFromEnvironment,
275 DialContext: (&net.Dialer{
276 Timeout: 30 * time.Second,
277 KeepAlive: 30 * time.Second,
278 DualStack: true,
279 }).DialContext,
280 ForceAttemptHTTP2: true,
281 MaxIdleConns: 100,
282 IdleConnTimeout: 90 * time.Second,
283 TLSHandshakeTimeout: 10 * time.Second,
284 ExpectContinueTimeout: 1 * time.Second,
285 }
286 }
287
View as plain text