-
Notifications
You must be signed in to change notification settings - Fork 0
/
resp.go
135 lines (122 loc) · 2.82 KB
/
resp.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 req
import (
"encoding/json"
"encoding/xml"
"fmt"
"io"
"net/http"
"os"
"regexp"
"time"
)
// Resp represents a request with it's response
type Resp struct {
r *Req
req *http.Request
resp *http.Response
client *http.Client
*multipartHelper
reqBody []byte
respBody []byte
cost time.Duration
}
// Cost returns time spent by the request
func (r *Resp) Cost() time.Duration {
return r.cost
}
// Request returns *http.Request
func (r *Resp) Request() *http.Request {
return r.req
}
// Response returns *http.Response
func (r *Resp) Response() *http.Response {
return r.resp
}
// Bytes returns response body as []byte
func (r *Resp) Bytes() []byte {
return r.respBody
}
// String returns response body as string
func (r *Resp) String() string {
return string(r.respBody)
}
// ToJSON convert json response body to struct or map
func (r *Resp) ToJSON(v interface{}) error {
return json.Unmarshal(r.respBody, v)
}
// ToXML convert xml response body to struct or map
func (r *Resp) ToXML(v interface{}) error {
return xml.Unmarshal(r.respBody, v)
}
// ToFile download the response body to file
func (r *Resp) ToFile(name string) error {
file, err := os.Create(name)
if err != nil {
return err
}
defer file.Close()
if r.respBody != nil {
_, err = file.Write(r.respBody)
if err != nil {
return err
}
} else {
_, err = io.Copy(file, r.resp.Body)
if err != nil {
return err
}
}
return nil
}
var regNewline = regexp.MustCompile(`\n|\r`)
func (r *Resp) Format(s fmt.State, verb rune) {
if r == nil || r.req == nil {
return
}
req := r.req
if s.Flag('+') { // include header and format pretty.
fmt.Fprint(s, r.dump())
} else if s.Flag('-') { // keep all informations in one line.
fmt.Fprint(s, req.Method, " ", req.URL.String())
if r.r.flag&Lcost != 0 {
fmt.Fprint(s, " ", r.cost.String())
}
if r.r.flag&LreqBody != 0 {
if len(r.reqBody) > 0 {
str := regNewline.ReplaceAllString(string(r.reqBody), " ")
fmt.Fprint(s, " ", str)
} else {
fmt.Fprint(s, " ******")
}
}
if r.r.flag&LrespBody != 0 {
if len(r.respBody) > 0 {
str := regNewline.ReplaceAllString(string(r.respBody), " ")
fmt.Fprint(s, " ", str)
} else {
fmt.Fprint(s, " ******")
}
}
} else { // auto
fmt.Fprint(s, req.Method, " ", req.URL.String())
if r.r.flag&Lcost != 0 {
fmt.Fprint(s, " ", r.cost.String())
}
respBody := r.respBody
if (len(r.reqBody) > 0 && regNewline.Match(r.reqBody)) || (len(respBody) > 0 && regNewline.Match(respBody)) { // pretty format
if len(r.reqBody) > 0 {
fmt.Fprint(s, "\n", string(r.reqBody))
}
if len(respBody) > 0 {
fmt.Fprint(s, "\n", string(respBody))
}
} else {
if len(r.reqBody) > 0 {
fmt.Fprint(s, " ", string(r.reqBody))
}
if len(respBody) > 0 {
fmt.Fprint(s, " ", string(respBody))
}
}
}
}