better handling of implicit defaults, reuse resolver object for the same URL
vyzo committed
Apr 14, 2021 at 10:01 UTC
77d6a08598180b8a4d546f2338809a3c3ebde214
1 file changed
+33
-10
core/node/dns.go
+33
-10
@@ -11,7 +11,10 @@ import (
11
"github.com/miekg/dns"
12
)
13
14
-const ethResolverURL = "https://eth.link/dns-query"
14
+var defaultResolvers = map[string]string{
15
+ "eth.": "https://resolver.cloudflare-eth.com/dns-query",
16
+ "crypto.": "https://resolver.cloudflare-eth.com/dns-query",
17
+}
18
19
func newResolver(url string) (madns.BasicResolver, error) {
20
if !strings.HasPrefix(url, "https://") {
@@ -23,16 +26,23 @@ func newResolver(url string) (madns.BasicResolver, error) {
26
27
func DNSResolver(cfg *config.Config) (*madns.Resolver, error) {
28
var opts []madns.Option
29
+ var err error
30
+
31
+ domains := make(map[string]struct{}) // to track overriden default resolvers
32
+ rslvrs := make(map[string]madns.BasicResolver) // to reuse resolvers for the same URL
33
27
- hasEth := false
34
for domain, url := range cfg.DNS.Resolvers {
35
if domain != "." && !dns.IsFqdn(domain) {
36
return nil, fmt.Errorf("invalid domain %s; must be FQDN", domain)
37
}
38
33
- rslv, err := newResolver(url)
34
- if err != nil {
35
- return nil, fmt.Errorf("bad resolver for %s: %w", domain, err)
39
+ rslv, ok := rslvrs[url]
40
+ if !ok {
41
+ rslv, err = newResolver(url)
42
+ if err != nil {
43
+ return nil, fmt.Errorf("bad resolver for %s: %w", domain, err)
44
+ }
45
+ rslvrs[url] = rslv
46
}
47
48
if domain != "." {
@@ -41,13 +51,26 @@ func DNSResolver(cfg *config.Config) (*madns.Resolver, error) {
51
opts = append(opts, madns.WithDefaultResolver(rslv))
52
}
53
44
- if domain == "eth." {
45
- hasEth = true
46
- }
54
+ domains[domain] = struct{}{}
55
}
56
49
- if !hasEth {
50
- opts = append(opts, madns.WithDomainResolver("eth.", doh.NewResolver(ethResolverURL)))
57
+ // fill in defaults if not overriden by the user
58
+ for domain, url := range defaultResolvers {
59
+ _, ok := domains[domain]
60
+ if ok {
61
+ continue
62
+ }
63
+
64
+ rslv, ok := rslvrs[url]
65
+ if !ok {
66
+ rslv, err = newResolver(url)
67
+ if err != nil {
68
+ return nil, fmt.Errorf("bad resolver for %s: %w", domain, err)
69
+ }
70
+ rslvrs[url] = rslv
71
+ }
72
+
73
+ opts = append(opts, madns.WithDomainResolver(domain, rslv))
74
}
75
76
return madns.NewResolver(opts...)