-
Notifications
You must be signed in to change notification settings - Fork 4
/
option.go
89 lines (72 loc) · 1.76 KB
/
option.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
package fxhttpclient
import (
"net/http"
"strings"
"time"
)
var DefaultHeadersToForward = []string{
"authorization",
"x-request-id",
"traceparent",
}
type options struct {
Transport http.RoundTripper
CheckRedirect func(req *http.Request, via []*http.Request) error
Jar http.CookieJar
Timeout time.Duration
HeadersToForward map[string][]string
}
var defaultHttpClientOptions = options{
Transport: boostedTransport(),
CheckRedirect: nil,
Timeout: time.Second * 10,
Jar: nil,
HeadersToForward: map[string][]string{},
}
type HttpClientOption func(o *options)
func WithTransport(t http.RoundTripper) HttpClientOption {
return func(o *options) {
o.Transport = t
}
}
func WithCheckRedirect(f func(req *http.Request, via []*http.Request) error) HttpClientOption {
return func(o *options) {
o.CheckRedirect = f
}
}
func WithCookieJar(j http.CookieJar) HttpClientOption {
return func(o *options) {
o.Jar = j
}
}
func WithTimeout(t time.Duration) HttpClientOption {
return func(o *options) {
o.Timeout = t
}
}
func WithRequestHeadersToForward(req *http.Request, headersNames []string) HttpClientOption {
headersToForward := map[string][]string{}
for name, values := range req.Header {
if contains(headersNames, name) {
headersToForward[strings.ToLower(name)] = values
}
}
return func(o *options) {
o.HeadersToForward = headersToForward
}
}
func boostedTransport() *http.Transport {
t := http.DefaultTransport.(*http.Transport).Clone()
t.MaxIdleConns = 100
t.MaxConnsPerHost = 100
t.MaxIdleConnsPerHost = 100
return t
}
func contains(slice []string, s string) bool {
for _, v := range slice {
if strings.ToLower(v) == strings.ToLower(s) {
return true
}
}
return false
}