-
Notifications
You must be signed in to change notification settings - Fork 0
/
httpClient.go
55 lines (48 loc) · 1.01 KB
/
httpClient.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
package net
import (
"context"
"net"
"net/http"
"sync"
"time"
)
var resolver *Resolver
var initOnce sync.Once
func init() {
initOnce.Do(func() {
resolver = &Resolver{}
options := ResolverRefreshOptions{}
options.ClearUnused = true
options.PersistOnFailure = false
resolver.RefreshWithOptions(options)
go func() {
t := time.NewTicker(1 * time.Minute)
defer t.Stop()
for range t.C {
resolver.Refresh(true)
}
}()
})
}
func NewDNSCacheHttpClient() *http.Client {
dialContext := func(ctx context.Context, network, addr string) (conn net.Conn, err error) {
host, port, err := net.SplitHostPort(addr)
if err != nil {
return nil, err
}
ips, err := resolver.LookupHost(ctx, host)
if err != nil {
return nil, err
}
for _, ip := range ips {
var dialer net.Dialer
conn, err = dialer.DialContext(ctx, network, net.JoinHostPort(ip, port))
if err == nil {
break
}
}
return
}
http.DefaultTransport.(*http.Transport).DialContext = dialContext
return &http.Client{}
}