diff options
author | Nikolay Markov <enchantner@gmail.com> | 2019-11-10 21:59:21 +0300 |
---|---|---|
committer | Erik Dubbelboer <erik@dubbelboer.com> | 2019-11-10 19:59:21 +0100 |
commit | 3fb2eba209d580a17c023702cb823039a88c08d3 (patch) | |
tree | 8ffbd1778a198bfb3c3b8cdd9dbcccd8ebeba388 /tcpdialer.go | |
parent | Recover from panic in body write (#687) (diff) | |
download | fasthttp-3fb2eba209d580a17c023702cb823039a88c08d3.tar.gz fasthttp-3fb2eba209d580a17c023702cb823039a88c08d3.tar.bz2 fasthttp-3fb2eba209d580a17c023702cb823039a88c08d3.zip |
Ability to pass custom DNS resolver to TCPDialer (#689)
* Ability to pass custom DNS resolver to TCPdialer
* Update tcpdialer.go
Co-Authored-By: Erik Dubbelboer <erik@dubbelboer.com>
Diffstat (limited to 'tcpdialer.go')
-rw-r--r-- | tcpdialer.go | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/tcpdialer.go b/tcpdialer.go index 6a5cd3a..8d84983 100644 --- a/tcpdialer.go +++ b/tcpdialer.go @@ -1,6 +1,7 @@ package fasthttp import ( + "context" "errors" "net" "strconv" @@ -129,6 +130,19 @@ type TCPDialer struct { // Changes made after the first Dial will not affect anything. Concurrency int + // This may be used to override DNS resolving policy, like this: + // var dialer = &fasthttp.TCPDialer{ + // Resolver: &net.Resolver{ + // PreferGo: true, + // StrictErrors: false, + // Dial: func (ctx context.Context, network, address string) (net.Conn, error) { + // d := net.Dialer{} + // return d.DialContext(ctx, "udp", "8.8.8.8:53") + // }, + // }, + // } + Resolver *net.Resolver + tcpAddrsLock sync.Mutex tcpAddrsMap map[string]*tcpAddrEntry @@ -387,7 +401,7 @@ func (d *TCPDialer) getTCPAddrs(addr string, dualStack bool) ([]net.TCPAddr, uin d.tcpAddrsLock.Unlock() if e == nil { - addrs, err := resolveTCPAddrs(addr, dualStack) + addrs, err := resolveTCPAddrs(addr, dualStack, d.Resolver) if err != nil { d.tcpAddrsLock.Lock() e = d.tcpAddrsMap[addr] @@ -412,7 +426,7 @@ func (d *TCPDialer) getTCPAddrs(addr string, dualStack bool) ([]net.TCPAddr, uin return e.addrs, idx, nil } -func resolveTCPAddrs(addr string, dualStack bool) ([]net.TCPAddr, error) { +func resolveTCPAddrs(addr string, dualStack bool, resolver *net.Resolver) ([]net.TCPAddr, error) { host, portS, err := net.SplitHostPort(addr) if err != nil { return nil, err @@ -422,20 +436,25 @@ func resolveTCPAddrs(addr string, dualStack bool) ([]net.TCPAddr, error) { return nil, err } - ips, err := net.LookupIP(host) + if resolver == nil { + resolver = net.DefaultResolver + } + + ctx := context.Background() + ipaddrs, err := resolver.LookupIPAddr(ctx, host) if err != nil { return nil, err } - n := len(ips) + n := len(ipaddrs) addrs := make([]net.TCPAddr, 0, n) for i := 0; i < n; i++ { - ip := ips[i] - if !dualStack && ip.To4() == nil { + ip := ipaddrs[i] + if !dualStack && ip.IP.To4() == nil { continue } addrs = append(addrs, net.TCPAddr{ - IP: ip, + IP: ip.IP, Port: port, }) } |