1
2
3
4
5 package http
6
7 import (
8 "bytes"
9 "io"
10 "io/ioutil"
11 "os"
12 )
13
14
15
16
17
18 func drainBody(b io.ReadCloser) (r1, r2 io.ReadCloser, err os.Error) {
19 var buf bytes.Buffer
20 if _, err = buf.ReadFrom(b); err != nil {
21 return nil, nil, err
22 }
23 if err = b.Close(); err != nil {
24 return nil, nil, err
25 }
26 return ioutil.NopCloser(&buf), ioutil.NopCloser(bytes.NewBuffer(buf.Bytes())), nil
27 }
28
29
30
31
32
33
34
35
36 func DumpRequest(req *Request, body bool) (dump []byte, err os.Error) {
37 var b bytes.Buffer
38 save := req.Body
39 if !body || req.Body == nil {
40 req.Body = nil
41 } else {
42 save, req.Body, err = drainBody(req.Body)
43 if err != nil {
44 return
45 }
46 }
47 err = req.Write(&b)
48 req.Body = save
49 if err != nil {
50 return
51 }
52 dump = b.Bytes()
53 return
54 }
55
56
57 func DumpResponse(resp *Response, body bool) (dump []byte, err os.Error) {
58 var b bytes.Buffer
59 save := resp.Body
60 savecl := resp.ContentLength
61 if !body || resp.Body == nil {
62 resp.Body = nil
63 resp.ContentLength = 0
64 } else {
65 save, resp.Body, err = drainBody(resp.Body)
66 if err != nil {
67 return
68 }
69 }
70 err = resp.Write(&b)
71 resp.Body = save
72 resp.ContentLength = savecl
73 if err != nil {
74 return
75 }
76 dump = b.Bytes()
77 return
78 }