@cryptotaxi247 / kubo / commits / 77d6a0859

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...)