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
|
package httpclient
import (
"context"
"io"
"net/http"
"time"
)
const DefaultTimeout = 30 * time.Second
const (
defaultTLSHandshakeTimeout = 10 * time.Second
defaultResponseHeaderTimeout = 15 * time.Second
defaultIdleConnTimeout = 90 * time.Second
defaultMaxIdleConnsPerHost = 10
)
var defaultTransport = func() *http.Transport {
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.TLSHandshakeTimeout = defaultTLSHandshakeTimeout
transport.ResponseHeaderTimeout = defaultResponseHeaderTimeout
transport.IdleConnTimeout = defaultIdleConnTimeout
transport.MaxIdleConnsPerHost = defaultMaxIdleConnsPerHost
return transport
}()
var defaultClient = &http.Client{
Timeout: DefaultTimeout,
Transport: defaultTransport,
}
func Do(req *http.Request) (*http.Response, error) {
return defaultClient.Do(req)
}
func NewRequest(method, url string, body io.Reader) (*http.Request, context.CancelFunc, error) {
ctx, cancel := context.WithTimeout(context.Background(), DefaultTimeout)
req, err := http.NewRequestWithContext(ctx, method, url, body)
if err != nil {
cancel()
return nil, nil, err
}
return req, cancel, nil
}
|