...
1 package adal
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import (
18 "crypto/tls"
19 "net"
20 "net/http"
21 "net/http/cookiejar"
22 "sync"
23 "time"
24
25 "github.com/Azure/go-autorest/tracing"
26 )
27
28 const (
29 contentType = "Content-Type"
30 mimeTypeFormPost = "application/x-www-form-urlencoded"
31 )
32
33
34 var defaultSender Sender
35 var defaultSenderInit = &sync.Once{}
36
37
38
39
40 type Sender interface {
41 Do(*http.Request) (*http.Response, error)
42 }
43
44
45 type SenderFunc func(*http.Request) (*http.Response, error)
46
47
48 func (sf SenderFunc) Do(r *http.Request) (*http.Response, error) {
49 return sf(r)
50 }
51
52
53
54
55 type SendDecorator func(Sender) Sender
56
57
58 func CreateSender(decorators ...SendDecorator) Sender {
59 return DecorateSender(sender(), decorators...)
60 }
61
62
63
64
65
66 func DecorateSender(s Sender, decorators ...SendDecorator) Sender {
67 for _, decorate := range decorators {
68 s = decorate(s)
69 }
70 return s
71 }
72
73 func sender() Sender {
74
75
76 defaultSenderInit.Do(func() {
77
78 transport := &http.Transport{
79 Proxy: http.ProxyFromEnvironment,
80 DialContext: (&net.Dialer{
81 Timeout: 30 * time.Second,
82 KeepAlive: 30 * time.Second,
83 }).DialContext,
84 ForceAttemptHTTP2: true,
85 MaxIdleConns: 100,
86 IdleConnTimeout: 90 * time.Second,
87 TLSHandshakeTimeout: 10 * time.Second,
88 ExpectContinueTimeout: 1 * time.Second,
89 TLSClientConfig: &tls.Config{
90 MinVersion: tls.VersionTLS12,
91 },
92 }
93 var roundTripper http.RoundTripper = transport
94 if tracing.IsEnabled() {
95 roundTripper = tracing.NewTransport(transport)
96 }
97 j, _ := cookiejar.New(nil)
98 defaultSender = &http.Client{Jar: j, Transport: roundTripper}
99 })
100 return defaultSender
101 }
102
View as plain text