Fix iOS DNS timeout (#1504)

This commit is contained in:
Viktor Liu
2024-01-29 17:10:47 +01:00
committed by GitHub
parent 25b3641be8
commit 9c56f74235
6 changed files with 18 additions and 28 deletions

View File

@@ -25,8 +25,7 @@ const (
const testRecord = "."
type upstreamClient interface {
exchange(upstream string, r *dns.Msg) (*dns.Msg, time.Duration, error)
exchangeContext(ctx context.Context, upstream string, r *dns.Msg) (*dns.Msg, time.Duration, error)
exchange(ctx context.Context, upstream string, r *dns.Msg) (*dns.Msg, time.Duration, error)
}
type UpstreamResolver interface {
@@ -80,8 +79,15 @@ func (u *upstreamResolverBase) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
}
for _, upstream := range u.upstreamServers {
var rm *dns.Msg
var t time.Duration
var err error
rm, t, err := u.upstreamClient.exchange(upstream, r)
func() {
ctx, cancel := context.WithTimeout(u.ctx, u.upstreamTimeout)
defer cancel()
rm, t, err = u.upstreamClient.exchange(ctx, upstream, r)
}()
if err != nil {
if errors.Is(err, context.DeadlineExceeded) || isTimeout(err) {
@@ -259,6 +265,6 @@ func (u *upstreamResolverBase) testNameserver(server string) error {
r := new(dns.Msg).SetQuestion(testRecord, dns.TypeSOA)
_, _, err := u.upstreamClient.exchangeContext(ctx, server, r)
_, _, err := u.upstreamClient.exchange(ctx, server, r)
return err
}