mirror of
https://github.com/netbirdio/netbird.git
synced 2025-02-23 13:41:19 +01:00
Fix iOS DNS timeout (#1504)
This commit is contained in:
parent
25b3641be8
commit
9c56f74235
@ -16,11 +16,11 @@ func Test_parseResolvConf(t *testing.T) {
|
|||||||
expectedOther []string
|
expectedOther []string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
input: `domain chello.hu
|
input: `domain example.org
|
||||||
search chello.hu
|
search example.org
|
||||||
nameserver 192.168.0.1
|
nameserver 192.168.0.1
|
||||||
`,
|
`,
|
||||||
expectedSearch: []string{"chello.hu"},
|
expectedSearch: []string{"example.org"},
|
||||||
expectedNS: []string{"192.168.0.1"},
|
expectedNS: []string{"192.168.0.1"},
|
||||||
expectedOther: []string{},
|
expectedOther: []string{},
|
||||||
},
|
},
|
||||||
|
@ -87,7 +87,7 @@ func (f *repair) watchFileChanges(nbSearchDomains []string, nbNameserverIP strin
|
|||||||
|
|
||||||
err = f.inotify.Add(f.watchDir)
|
err = f.inotify.Add(f.watchDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("failed to readd inotify watch for resolv.conf: %s", err)
|
log.Errorf("failed to re-add inotify watch for resolv.conf: %s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,8 +25,7 @@ const (
|
|||||||
const testRecord = "."
|
const testRecord = "."
|
||||||
|
|
||||||
type upstreamClient interface {
|
type upstreamClient interface {
|
||||||
exchange(upstream string, r *dns.Msg) (*dns.Msg, time.Duration, error)
|
exchange(ctx context.Context, upstream string, r *dns.Msg) (*dns.Msg, time.Duration, error)
|
||||||
exchangeContext(ctx context.Context, upstream string, r *dns.Msg) (*dns.Msg, time.Duration, error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type UpstreamResolver interface {
|
type UpstreamResolver interface {
|
||||||
@ -80,8 +79,15 @@ func (u *upstreamResolverBase) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, upstream := range u.upstreamServers {
|
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 err != nil {
|
||||||
if errors.Is(err, context.DeadlineExceeded) || isTimeout(err) {
|
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)
|
r := new(dns.Msg).SetQuestion(testRecord, dns.TypeSOA)
|
||||||
|
|
||||||
_, _, err := u.upstreamClient.exchangeContext(ctx, server, r)
|
_, _, err := u.upstreamClient.exchange(ctx, server, r)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -40,11 +40,7 @@ func newUpstreamResolver(parentCTX context.Context, interfaceName string, ip net
|
|||||||
return ios, nil
|
return ios, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *upstreamResolverIOS) exchange(upstream string, r *dns.Msg) (rm *dns.Msg, t time.Duration, err error) {
|
func (u *upstreamResolverIOS) exchange(ctx context.Context, upstream string, r *dns.Msg) (rm *dns.Msg, t time.Duration, err error) {
|
||||||
return u.exchangeContext(context.Background(), upstream, r)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *upstreamResolverIOS) exchangeContext(ctx context.Context, upstream string, r *dns.Msg) (rm *dns.Msg, t time.Duration, err error) {
|
|
||||||
client := &dns.Client{}
|
client := &dns.Client{}
|
||||||
upstreamHost, _, err := net.SplitHostPort(upstream)
|
upstreamHost, _, err := net.SplitHostPort(upstream)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -23,14 +23,7 @@ func newUpstreamResolver(parentCTX context.Context, interfaceName string, ip net
|
|||||||
return nonIOS, nil
|
return nonIOS, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *upstreamResolverNonIOS) exchange(upstream string, r *dns.Msg) (rm *dns.Msg, t time.Duration, err error) {
|
func (u *upstreamResolverNonIOS) exchange(ctx context.Context, upstream string, r *dns.Msg) (rm *dns.Msg, t time.Duration, err error) {
|
||||||
// default upstream timeout
|
|
||||||
ctx, cancel := context.WithTimeout(u.ctx, u.upstreamTimeout)
|
|
||||||
defer cancel()
|
|
||||||
return u.exchangeContext(ctx, upstream, r)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *upstreamResolverNonIOS) exchangeContext(ctx context.Context, upstream string, r *dns.Msg) (rm *dns.Msg, t time.Duration, err error) {
|
|
||||||
upstreamExchangeClient := &dns.Client{}
|
upstreamExchangeClient := &dns.Client{}
|
||||||
return upstreamExchangeClient.ExchangeContext(ctx, r, upstream)
|
return upstreamExchangeClient.ExchangeContext(ctx, r, upstream)
|
||||||
}
|
}
|
||||||
|
@ -105,13 +105,8 @@ type mockUpstreamResolver struct {
|
|||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exchange mock implementation of Exchangefrom upstreamResolver
|
// exchange mock implementation of exchange from upstreamResolver
|
||||||
func (c mockUpstreamResolver) exchange(upstream string, r *dns.Msg) (*dns.Msg, time.Duration, error) {
|
func (c mockUpstreamResolver) exchange(_ context.Context, _ string, _ *dns.Msg) (*dns.Msg, time.Duration, error) {
|
||||||
return c.exchangeContext(context.Background(), upstream, r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExchangeContext mock implementation of ExchangeContext from upstreamResolver
|
|
||||||
func (c mockUpstreamResolver) exchangeContext(_ context.Context, _ string, _ *dns.Msg) (*dns.Msg, time.Duration, error) {
|
|
||||||
return c.r, c.rtt, c.err
|
return c.r, c.rtt, c.err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user