mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-12-15 19:31:45 +03:00
05262d7b6b
Squashed commit of the following: commit 7a24cf8f9c5515f642cbfc7e730b95005eeab11d Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Tue Aug 15 14:54:16 2023 +0300 all: upd code, deps, tools
57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
package dnsforward
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/AdguardTeam/golibs/errors"
|
|
"github.com/AdguardTeam/golibs/log"
|
|
)
|
|
|
|
// DialContext is an [aghnet.DialContextFunc] that uses s to resolve hostnames.
|
|
func (s *Server) DialContext(ctx context.Context, network, addr string) (conn net.Conn, err error) {
|
|
log.Debug("dnsforward: dialing %q for network %q", addr, network)
|
|
|
|
host, port, err := net.SplitHostPort(addr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
dialer := &net.Dialer{
|
|
// TODO(a.garipov): Consider making configurable.
|
|
Timeout: time.Minute * 5,
|
|
}
|
|
|
|
if net.ParseIP(host) != nil {
|
|
return dialer.DialContext(ctx, network, addr)
|
|
}
|
|
|
|
addrs, err := s.Resolve(host)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("resolving %q: %w", host, err)
|
|
}
|
|
|
|
log.Debug("dnsforward: resolving %q: %v", host, addrs)
|
|
|
|
if len(addrs) == 0 {
|
|
return nil, fmt.Errorf("no addresses for host %q", host)
|
|
}
|
|
|
|
var dialErrs []error
|
|
for _, a := range addrs {
|
|
addr = net.JoinHostPort(a.String(), port)
|
|
conn, err = dialer.DialContext(ctx, network, addr)
|
|
if err != nil {
|
|
dialErrs = append(dialErrs, err)
|
|
|
|
continue
|
|
}
|
|
|
|
return conn, nil
|
|
}
|
|
|
|
return nil, errors.Join(dialErrs...)
|
|
}
|