-
Notifications
You must be signed in to change notification settings - Fork 4
/
http.go
109 lines (95 loc) · 2.43 KB
/
http.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
package restful
import (
"bytes"
"errors"
"io"
"net/http"
"sync"
"time"
log "gopkg.in/clog.v1"
)
var (
bufferSize4K = 4096
bufferPool4K = sync.Pool{
New: func() interface{} {
return bytes.NewBuffer(make([]byte, bufferSize4K))
},
}
httpHeaders = map[string]string{
"User-Agent": "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36",
"ContentType": "application/json", //"text/html; charset=utf-8",
"Connection": "keep-alive",
}
httpClient = &http.Client{
Timeout: time.Minute * 1,
}
)
// HttpGet wrap of http.Get
//
func HttpGet(uri string, fnCallback func(*http.Request)) (*bytes.Buffer, error) {
var (
err error
buffer *bytes.Buffer
resp *http.Response
req *http.Request
)
if req, err = http.NewRequest("GET", uri, nil); err != nil {
log.Warn("[GET] New request of %s failed: %s.", uri, err)
return nil, err
}
req.Header.Set("User-Agent", httpHeaders["User-Agent"])
if fnCallback != nil {
fnCallback(req)
}
if resp, err = httpClient.Do(req); err != nil {
log.Warn("[GET] Http GET %s failed: %s.", uri, err)
return nil, err
}
if resp.StatusCode != http.StatusOK {
err = errors.New(resp.Status)
}
defer resp.Body.Close()
buffer = bufferPool4K.Get().(*bytes.Buffer)
buffer.Reset()
if _, err2 := io.Copy(buffer, resp.Body); err2 != nil {
log.Warn("[GET] Read response failed: %s.", err2)
bufferPool4K.Put(buffer)
return nil, err2
}
return buffer, err
}
// HttpPost wrap of http.Post
//
func HttpPost(uri string, body io.Reader, fnCallback func(*http.Request)) (*bytes.Buffer, error) {
var (
err error
buffer *bytes.Buffer
resp *http.Response
req *http.Request
)
if req, err = http.NewRequest("POST", uri, body); err != nil {
log.Warn("[POST] New request of %s failed: %s.", uri, err)
return nil, err
}
req.Header.Set("User-Agent", httpHeaders["User-Agent"])
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") // must
if fnCallback != nil {
fnCallback(req)
}
if resp, err = httpClient.Do(req); err != nil {
log.Warn("[POST] Http POST %s failed: %s.", uri, err)
return nil, err
}
if resp.StatusCode != http.StatusOK {
err = errors.New(resp.Status)
}
defer resp.Body.Close()
buffer = bufferPool4K.Get().(*bytes.Buffer)
buffer.Reset()
if _, err2 := io.Copy(buffer, resp.Body); err2 != nil {
log.Warn("[POST] Read response failed: %s.", err2)
bufferPool4K.Put(buffer)
return nil, err2
}
return buffer, err
}