@@ -34,13 +34,6 @@ import (
34
34
"github.com/erda-project/erda/pkg/clusterdialer"
35
35
)
36
36
37
- const (
38
- // DialTimeout 建立 tcp 连接的超时时间
39
- DialTimeout = 15 * time .Second
40
- // ClientDefaultTimeout 从建立 tcp 到读完 response body 超时时间
41
- ClientDefaultTimeout = 60 * time .Second
42
- )
43
-
44
37
type BasicAuth struct {
45
38
name string
46
39
password string
@@ -202,16 +195,40 @@ func WithEnableAutoRetry(enableAutoRetry bool) OpOption {
202
195
}
203
196
}
204
197
205
- func mkDialContext (option * Option ) func (ctx context.Context , network , addr string ) (net.Conn , error ) {
206
- raw := (& net.Dialer {
207
- Timeout : option .dialTimeout ,
208
- KeepAlive : option .dialerKeepalive ,
198
+ var defaultTransport = newdefaultTransport (newDialContext (0 , 0 ))
199
+
200
+ func newDialContext (dialTimeout , tcpKeepAlive time.Duration ) func (ctx context.Context , network , addr string ) (net.Conn , error ) {
201
+ if dialTimeout == 0 {
202
+ dialTimeout = 15 * time .Second
203
+ }
204
+ if tcpKeepAlive == 0 {
205
+ tcpKeepAlive = 60 * time .Second
206
+ }
207
+ return (& net.Dialer {
208
+ Timeout : dialTimeout ,
209
+ KeepAlive : tcpKeepAlive ,
209
210
}).DialContext
211
+ }
212
+
213
+ func newdefaultTransport (dialContext func (ctx context.Context , network , addr string ) (net.Conn , error )) * http.Transport {
214
+ return & http.Transport {
215
+ DialContext : dialContext ,
216
+ Proxy : http .ProxyFromEnvironment ,
217
+ ForceAttemptHTTP2 : false ,
218
+ MaxIdleConns : 10 ,
219
+ IdleConnTimeout : 90 * time .Second ,
220
+ TLSHandshakeTimeout : 10 * time .Second ,
221
+ ExpectContinueTimeout : 1 * time .Second ,
222
+ }
223
+ }
224
+
225
+ func mkDialContext (clusterDialKey string , dnscache * DNSCache , dialTimeout , tcpKeepAlive time.Duration ) func (ctx context.Context , network , addr string ) (net.Conn , error ) {
226
+ raw := newDialContext (dialTimeout , tcpKeepAlive )
210
227
dialcontext := raw
211
- if option . clusterDialKey != "" {
212
- return clusterdialer .DialContext (option . clusterDialKey )
228
+ if clusterDialKey != "" {
229
+ return clusterdialer .DialContext (clusterDialKey )
213
230
}
214
- if option . dnscache != nil {
231
+ if dnscache != nil {
215
232
dialcontext = func (ctx context.Context , network , addr string ) (net.Conn , error ) {
216
233
var host string
217
234
var remain string
@@ -231,7 +248,7 @@ func mkDialContext(option *Option) func(ctx context.Context, network, addr strin
231
248
if net .ParseIP (host ) != nil || (! strings .HasPrefix (network , "tcp" ) && ! strings .HasPrefix (network , "udp" )) {
232
249
return raw (ctx , network , addr )
233
250
}
234
- ips , err := option . dnscache .lookup (host )
251
+ ips , err := dnscache .lookup (host )
235
252
if err != nil {
236
253
return raw (ctx , network , addr )
237
254
}
@@ -250,37 +267,39 @@ func mkDialContext(option *Option) func(ctx context.Context, network, addr strin
250
267
251
268
func New (ops ... OpOption ) * HTTPClient {
252
269
option := & Option {}
253
- option .dialTimeout = DialTimeout
254
- option .clientTimeout = ClientDefaultTimeout
255
270
for _ , op := range ops {
256
271
op (option )
257
272
}
258
273
259
- tr := & http.Transport {
260
- DialContext : mkDialContext (option ),
261
- MaxIdleConns : 2 ,
262
- }
263
- if option .proxy != "" {
264
- tr .Proxy = func (request * http.Request ) (u * url.URL , err error ) {
265
- return url .Parse (option .proxy )
266
- }
267
- }
268
- if option .dialerKeepalive != 0 {
269
- tr .IdleConnTimeout = option .dialerKeepalive
270
- }
271
- tr .ExpectContinueTimeout = 1 * time .Second
272
274
proto := "http"
273
275
if option .isHTTPS {
274
276
proto = "https"
275
- if option .ca != nil {
276
- tr .TLSClientConfig = & tls.Config {
277
- RootCAs : option .ca ,
278
- Certificates : []tls.Certificate {option .keyPair },
277
+ }
278
+
279
+ var tr = defaultTransport
280
+ if option .clusterDialKey != "" || option .dnscache != nil || option .dialTimeout != 0 || option .clientTimeout != 0 ||
281
+ option .proxy != "" || option .dialerKeepalive != 0 || option .ca != nil {
282
+ tr = newdefaultTransport (mkDialContext (option .clusterDialKey , option .dnscache , option .dialTimeout , option .clientTimeout ))
283
+ tr .MaxIdleConns = - 1 // disable connection pool
284
+ if option .proxy != "" {
285
+ tr .Proxy = func (request * http.Request ) (u * url.URL , err error ) {
286
+ return url .Parse (option .proxy )
279
287
}
280
- } else {
281
- tr .TLSClientConfig = & tls.Config {
282
- InsecureSkipVerify : true ,
283
- Certificates : []tls.Certificate {option .keyPair },
288
+ }
289
+ if option .dialerKeepalive != 0 {
290
+ tr .IdleConnTimeout = option .dialerKeepalive
291
+ }
292
+ if option .isHTTPS {
293
+ if option .ca != nil {
294
+ tr .TLSClientConfig = & tls.Config {
295
+ RootCAs : option .ca ,
296
+ Certificates : []tls.Certificate {option .keyPair },
297
+ }
298
+ } else {
299
+ tr .TLSClientConfig = & tls.Config {
300
+ InsecureSkipVerify : true ,
301
+ Certificates : []tls.Certificate {option .keyPair },
302
+ }
284
303
}
285
304
}
286
305
}
0 commit comments