-
Notifications
You must be signed in to change notification settings - Fork 110
/
request.go
executable file
·204 lines (184 loc) · 4.7 KB
/
request.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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
package model
import (
"encoding/json"
"errors"
"github.com/yhy0/Jie/crawler/crawlergo/config"
"github.com/yhy0/Jie/crawler/crawlergo/tools"
"github.com/yhy0/logging"
"net/url"
"strings"
)
type Filter struct {
MarkedQueryMap map[string]interface{}
QueryKeysId string
QueryMapId string
MarkedPostDataMap map[string]interface{}
PostDataId string
MarkedPath string
FragmentID string
PathId string
UniqueId string
}
type Options struct {
Headers map[string]interface{}
PostData string
}
type Request struct {
URL *URL
Method string
Headers map[string]interface{}
PostData string
Filter Filter
Source string
RedirectionFlag bool
Proxy string
}
var supportContentType = []string{config.JSON, config.URLENCODED}
/*
*
获取Request对象
可选设置headers和postData
*/
func GetRequest(method string, URL *URL, options ...Options) Request {
var req Request
req.URL = URL
req.Method = strings.ToUpper(method)
if len(options) != 0 {
option := options[0]
if option.Headers != nil {
req.Headers = option.Headers
}
if option.PostData != "" {
req.PostData = option.PostData
}
} else {
req.Headers = map[string]interface{}{}
}
return req
}
/*
*
完整格式化输出
*/
func (req *Request) FormatPrint() {
var tempStr = req.Method
tempStr += " " + req.URL.String() + " HTTP/1.1\r\n"
for k, v := range req.Headers {
tempStr += k + ": " + v.(string) + "\r\n"
}
tempStr += "\r\n"
if req.Method == config.POST {
tempStr += req.PostData
}
logging.Logger.Println(tempStr)
}
/*
*
简要输出
*/
func (req *Request) SimplePrint() {
var tempStr = req.Method
tempStr += " " + req.URL.String() + " "
if req.Method == config.POST {
tempStr += req.PostData
}
logging.Logger.Println(tempStr)
}
func (req *Request) SimpleFormat() string {
var tempStr = req.Method
tempStr += " " + req.URL.String() + " "
if req.Method == config.POST {
tempStr += req.PostData
}
return tempStr
}
/*
*
不加入Header的请求ID
*/
func (req *Request) NoHeaderId() string {
return tools.StrMd5(req.Method + req.URL.String() + req.PostData)
}
func (req *Request) UniqueId() string {
if req.RedirectionFlag {
return tools.StrMd5(req.NoHeaderId() + "Redirection")
} else {
return req.NoHeaderId()
}
}
/*
*
返回POST请求数据解析后的map结构
支持 application/x-www-form-urlencoded 、application/json
如果解析失败,则返回 key: postDataStr 的map结构
*/
func (req *Request) PostDataMap() map[string]interface{} {
contentType, err := req.getContentType()
if err != nil {
return map[string]interface{}{
"key": req.PostData,
}
}
if strings.HasPrefix(contentType, config.JSON) {
var result map[string]interface{}
err = json.Unmarshal([]byte(req.PostData), &result)
if err != nil {
return map[string]interface{}{
"key": req.PostData,
}
} else {
return result
}
} else if strings.HasPrefix(contentType, config.URLENCODED) {
var result = map[string]interface{}{}
r, err := url.ParseQuery(req.PostData)
if err != nil {
return map[string]interface{}{
"key": req.PostData,
}
} else {
for key, value := range r {
if len(value) == 1 {
result[key] = value[0]
} else {
result[key] = value
}
}
return result
}
} else {
return map[string]interface{}{
"key": req.PostData,
}
}
}
/*
*
返回GET请求参数解析后的map结构
*/
func (req *Request) QueryMap() map[string][]string {
return req.URL.Query()
}
/*
*
获取content-type
*/
func (req *Request) getContentType() (string, error) {
headers := req.Headers
var contentType string
if ct, ok := headers["Content-Type"]; ok {
contentType = ct.(string)
} else if ct, ok := headers["Content-type"]; ok {
contentType = ct.(string)
} else if ct, ok := headers["content-type"]; ok {
contentType = ct.(string)
} else {
return "", errors.New("no content-type")
}
for _, ct := range supportContentType {
if strings.HasPrefix(contentType, ct) {
return contentType, nil
}
}
return "", errors.New("dont support such content-type:" + contentType)
}