From 9b6f66c1bbf82e804e276d429db715e52b6c3a46 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Mon, 4 Jul 2011 22:27:23 +0200 Subject: [PATCH] panic when no client handler is found --- client.go | 13 ++++++------- client_test.go | 39 ++++++++++++++++++++++++++++++++++++--- server.go | 20 +++++++++++++------- 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/client.go b/client.go index 18770965..4a3c35d4 100644 --- a/client.go +++ b/client.go @@ -98,11 +98,7 @@ func (mux *QueryMux) Handle(pattern string, handler QueryHandler) { if pattern == "" { panic("dns: invalid pattern " + pattern) } - if pattern[len(pattern)-1] != '.' { // no ending . - mux.m[pattern+"."] = handler - } else { - mux.m[pattern] = handler - } + mux.m[pattern] = handler } func (mux *QueryMux) HandleQueryFunc(pattern string, handler func(RequestWriter, *Msg)) { @@ -112,8 +108,7 @@ func (mux *QueryMux) HandleQueryFunc(pattern string, handler func(RequestWriter, func (mux *QueryMux) QueryDNS(w RequestWriter, r *Msg) { h := mux.match(r.Question[0].Name) if h == nil { - // h = RefusedHandler() - // something else + panic("dns: no handler found for " + r.Question[0].Name) } h.QueryDNS(w, r) } @@ -170,6 +165,10 @@ func (q *Query) ListenAndQuery() os.Error { return q.Query() } + +// Start listener for firing off the queries. If +// c is nil DefaultQueryChan is used. If handler is nil +// DefaultQueryMux is used. func ListenAndQuery(c chan *Request, handler QueryHandler) { q := &Query{ChannelQuery: c, Handler: handler} go q.ListenAndQuery() diff --git a/client_test.go b/client_test.go index 77f52ec0..e64725ea 100644 --- a/client_test.go +++ b/client_test.go @@ -17,10 +17,43 @@ func TestClientSync(t *testing.T) { t.Logf("%v\n", r) } } -// TestClientAsync + + +func helloMiek(w RequestWriter, r *Msg) { + w.Send(r) + reply, _ := w.Receive() + w.Write(reply) +} + +func TestClientASync(t *testing.T) { + HandleQueryFunc("miek.nl", helloMiek) // All queries for miek.nl will be handled by HelloMiek + ListenAndQuery(nil, nil) + + m := new(Msg) + m.SetQuestion("miek.nl", TypeSOA) + + println("SENDING") + c := NewClient() + println("SENDING II") + c.Do(m, "85.223.71.124:53") + + println("REPLY") +forever: + for { + select { + case n := <-DefaultReplyChan: + println("REPLY") + if n[1] != nil && n[1].Rcode != RcodeSuccess { + t.Log("Failed to get an valid answer") + t.Fail() + t.Logf("%v\n", n[1]) + } + break forever + } + } +} + // TestClientEDNS - - /* func TestResolverEdns(t *testing.T) { diff --git a/server.go b/server.go index a38f39ed..34e51994 100644 --- a/server.go +++ b/server.go @@ -90,6 +90,12 @@ func zoneMatch(pattern, zone string) (ok bool) { if len(pattern) == 0 { return } + if pattern[len(pattern)-1] != '.' { + pattern += "." + } + if zone[len(zone)-1] != '.' { + zone += "." + } i := 0 for { ok = pattern[len(pattern)-1-i] == zone[len(zone)-1-i] @@ -125,11 +131,11 @@ func (mux *ServeMux) Handle(pattern string, handler Handler) { if pattern == "" { panic("dns: invalid pattern " + pattern) } - if pattern[len(pattern)-1] != '.' { // no ending . - mux.m[pattern+"."] = handler - } else { - mux.m[pattern] = handler - } + // Should this go + //if pattern[len(pattern)-1] != '.' { // no ending . + // mux.m[pattern+"."] = handler + //} else { + mux.m[pattern] = handler } func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Msg)) { @@ -190,7 +196,7 @@ func (srv *Server) ListenAndServe() os.Error { } switch srv.Net { case "tcp": - a, e := net.ResolveTCPAddr("tcp",addr) + a, e := net.ResolveTCPAddr("tcp", addr) if e != nil { return e } @@ -200,7 +206,7 @@ func (srv *Server) ListenAndServe() os.Error { } return srv.ServeTCP(l) case "udp": - a, e := net.ResolveUDPAddr("udp",addr) + a, e := net.ResolveUDPAddr("udp", addr) if e != nil { return e }