aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Zhengkai Wang <xuxiao415@foxmail.com> 2024-02-10 17:00:01 +0800
committerGravatar GitHub <noreply@github.com> 2024-02-10 10:00:01 +0100
commitdfb7e62a3d8e491d8587ffb09477535e21d3c8dd (patch)
treee56f60426da5d2a75065b292a42a783b770d1104
parentTry fixing oss-fuzz running out of memory and skipping a lot (diff)
downloadfasthttp-dfb7e62a3d8e491d8587ffb09477535e21d3c8dd.tar.gz
fasthttp-dfb7e62a3d8e491d8587ffb09477535e21d3c8dd.tar.bz2
fasthttp-dfb7e62a3d8e491d8587ffb09477535e21d3c8dd.zip
add DisableDNSResolution for TCPDialer. Sometimes, users do not need to use DNS resolution because they have already determined that the requested address is a list of IP addresses. (#1702)
Co-authored-by: wangzhengkai.wzk <wangzhengkai.wzk@alibaba-inc.com>
-rw-r--r--tcpdialer.go25
1 files changed, 15 insertions, 10 deletions
diff --git a/tcpdialer.go b/tcpdialer.go
index 7edd79f..e8430cb 100644
--- a/tcpdialer.go
+++ b/tcpdialer.go
@@ -151,6 +151,8 @@ type TCPDialer struct {
// }
Resolver Resolver
+ // DisableDNSResolution may be used to disable DNS resolution
+ DisableDNSResolution bool
// DNSCacheDuration may be used to override the default DNS cache duration (DefaultDNSCacheDuration)
DNSCacheDuration time.Duration
@@ -277,23 +279,26 @@ func (d *TCPDialer) dial(addr string, dualStack bool, timeout time.Duration) (ne
d.DNSCacheDuration = DefaultDNSCacheDuration
}
- go d.tcpAddrsClean()
+ if !d.DisableDNSResolution {
+ go d.tcpAddrsClean()
+ }
})
-
deadline := time.Now().Add(timeout)
- addrs, idx, err := d.getTCPAddrs(addr, dualStack, deadline)
- if err != nil {
- return nil, err
- }
network := "tcp4"
if dualStack {
network = "tcp"
}
-
+ if d.DisableDNSResolution {
+ return d.tryDial(network, addr, deadline, d.concurrencyCh)
+ }
+ addrs, idx, err := d.getTCPAddrs(addr, dualStack, deadline)
+ if err != nil {
+ return nil, err
+ }
var conn net.Conn
n := uint32(len(addrs))
for n > 0 {
- conn, err = d.tryDial(network, &addrs[idx%n], deadline, d.concurrencyCh)
+ conn, err = d.tryDial(network, addrs[idx%n].String(), deadline, d.concurrencyCh)
if err == nil {
return conn, nil
}
@@ -307,7 +312,7 @@ func (d *TCPDialer) dial(addr string, dualStack bool, timeout time.Duration) (ne
}
func (d *TCPDialer) tryDial(
- network string, addr *net.TCPAddr, deadline time.Time, concurrencyCh chan struct{},
+ network string, addr string, deadline time.Time, concurrencyCh chan struct{},
) (net.Conn, error) {
timeout := time.Until(deadline)
if timeout <= 0 {
@@ -340,7 +345,7 @@ func (d *TCPDialer) tryDial(
ctx, cancelCtx := context.WithDeadline(context.Background(), deadline)
defer cancelCtx()
- conn, err := dialer.DialContext(ctx, network, addr.String())
+ conn, err := dialer.DialContext(ctx, network, addr)
if err != nil && ctx.Err() == context.DeadlineExceeded {
return nil, ErrDialTimeout
}