From db9bae416285b396ab84e6c00b96ce32c4793e4f Mon Sep 17 00:00:00 2001 From: Michael Bridgen Date: Wed, 14 Jan 2015 16:43:47 +0000 Subject: [PATCH] Use the fallback for reverse lookups too I considered a couple of different factorings, that is * Implementing the fallback as a Lookup * Having a server struct that held the resolv.conf and methods for handling queries but ultimately, this is simple and works. --- nameserver/server.go | 8 ++++---- nameserver/server_test.go | 11 ++++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/nameserver/server.go b/nameserver/server.go index f123da57..20fa94c5 100644 --- a/nameserver/server.go +++ b/nameserver/server.go @@ -51,6 +51,7 @@ func queryHandler(lookups []Lookup) dns.HandlerFunc { } func rdnsHandler(lookups []Lookup) dns.HandlerFunc { + fallback := notUsHandler() return func(w dns.ResponseWriter, r *dns.Msg) { q := r.Question[0] Debug.Printf("Reverse query: %+v", q) @@ -62,13 +63,12 @@ func rdnsHandler(lookups []Lookup) dns.HandlerFunc { return } } - Info.Printf("[dns msgid %d] No results for type %s query %s", - r.MsgHdr.Id, dns.TypeToString[q.Qtype], q.Name) + fallback(w, r) + return } else { Warning.Printf("[dns msgid %d] Unexpected reverse query type %s: %+v", r.MsgHdr.Id, dns.TypeToString[q.Qtype], q) } - w.WriteMsg(makeDNSFailResponse(r)) } } @@ -80,7 +80,7 @@ func notUsHandler() dns.HandlerFunc { checkFatal(err) return func(w dns.ResponseWriter, r *dns.Msg) { q := r.Question[0] - Debug.Printf("[dns msgid %d] Non-local query: %+v", r.MsgHdr.Id, q) + Debug.Printf("[dns msgid %d] Fallback query: %+v", r.MsgHdr.Id, q) for _, server := range config.Servers { reply, err := dns.Exchange(r, fmt.Sprintf("%s:%s", server, config.Port)) if err != nil { diff --git a/nameserver/server_test.go b/nameserver/server_test.go index 8ad62f06..f38c510b 100644 --- a/nameserver/server_test.go +++ b/nameserver/server_test.go @@ -78,5 +78,14 @@ func TestDNSServer(t *testing.T) { t.Fatal("Number of answers > 0") } - // Not testing MDNS functionality of server here (yet) + m.SetQuestion("8.8.8.8.in-addr.arpa.", dns.TypePTR) + r, _, err = c.Exchange(m, dnsAddr) + wt.AssertNoErr(t, err) + wt.AssertStatus(t, r.Rcode, dns.RcodeSuccess, "DNS success response code") + if !(len(r.Answer) > 0) { + t.Fatal("Number of answers > 0") + } + + // Not testing MDNS functionality of server here (yet), since it + // needs two servers, each listening on its own address }