Feature: add support for dns search domains (#2597)
This commit is contained in:
@ -39,6 +39,7 @@ type Resolver struct {
|
||||
group singleflight.Group
|
||||
lruCache *cache.LruCache
|
||||
policy *trie.DomainTrie
|
||||
searchDomains []string
|
||||
}
|
||||
|
||||
// LookupIP request with TypeA and TypeAAAA, priority return TypeA
|
||||
@ -285,16 +286,33 @@ func (r *Resolver) lookupIP(ctx context.Context, host string, dnsType uint16) ([
|
||||
query := &D.Msg{}
|
||||
query.SetQuestion(D.Fqdn(host), dnsType)
|
||||
|
||||
msg, err := r.Exchange(query)
|
||||
msg, err := r.ExchangeContext(ctx, query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ips := msgToIP(msg)
|
||||
if len(ips) == 0 {
|
||||
if len(ips) != 0 {
|
||||
return ips, nil
|
||||
} else if len(r.searchDomains) == 0 {
|
||||
return nil, resolver.ErrIPNotFound
|
||||
}
|
||||
return ips, nil
|
||||
|
||||
// query provided search domains serially
|
||||
for _, domain := range r.searchDomains {
|
||||
q := &D.Msg{}
|
||||
q.SetQuestion(D.Fqdn(fmt.Sprintf("%s.%s", host, domain)), dnsType)
|
||||
msg, err := r.ExchangeContext(ctx, q)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ips := msgToIP(msg)
|
||||
if len(ips) != 0 {
|
||||
return ips, nil
|
||||
}
|
||||
}
|
||||
|
||||
return nil, resolver.ErrIPNotFound
|
||||
}
|
||||
|
||||
func (r *Resolver) msgToDomain(msg *D.Msg) string {
|
||||
@ -336,6 +354,7 @@ type Config struct {
|
||||
Pool *fakeip.Pool
|
||||
Hosts *trie.DomainTrie
|
||||
Policy map[string]NameServer
|
||||
SearchDomains []string
|
||||
}
|
||||
|
||||
func NewResolver(config Config) *Resolver {
|
||||
@ -345,10 +364,11 @@ func NewResolver(config Config) *Resolver {
|
||||
}
|
||||
|
||||
r := &Resolver{
|
||||
ipv6: config.IPv6,
|
||||
main: transform(config.Main, defaultResolver),
|
||||
lruCache: cache.New(cache.WithSize(4096), cache.WithStale(true)),
|
||||
hosts: config.Hosts,
|
||||
ipv6: config.IPv6,
|
||||
main: transform(config.Main, defaultResolver),
|
||||
lruCache: cache.New(cache.WithSize(4096), cache.WithStale(true)),
|
||||
hosts: config.Hosts,
|
||||
searchDomains: config.SearchDomains,
|
||||
}
|
||||
|
||||
if len(config.Fallback) != 0 {
|
||||
|
Reference in New Issue
Block a user