diff --git a/defaults.go b/defaults.go index f483d4a3..0c8fa9c8 100644 --- a/defaults.go +++ b/defaults.go @@ -169,7 +169,7 @@ func IsMsg(buf []byte) error { return errors.New("dns: bad message header") } // Header: Opcode - + // TODO(miek): more checks here, e.g. check all header bits. return nil } diff --git a/server.go b/server.go index cf3353bd..9186d77b 100644 --- a/server.go +++ b/server.go @@ -77,8 +77,7 @@ func (f HandlerFunc) ServeDNS(w ResponseWriter, r *Msg) { f(w, r) } -// FailedHandler returns a HandlerFunc -// returns SERVFAIL for every request it gets. +// FailedHandler returns a HandlerFunc that returns SERVFAIL for every request it gets. func HandleFailed(w ResponseWriter, r *Msg) { m := new(Msg) m.SetRcode(r, RcodeServerFailure) @@ -437,6 +436,7 @@ func (srv *Server) serve(a net.Addr, h Handler, m []byte, u *net.UDPConn, s *ses } }() Redo: + // Ideally we want use isMsg here before we allocate memory to actually parse the packet. req := new(Msg) err := req.Unpack(m) if err != nil { // Send a FormatError back @@ -445,6 +445,9 @@ Redo: w.WriteMsg(x) goto Exit } + if req.Response { + goto Exit + } w.tsigStatus = nil if w.tsigSecret != nil { diff --git a/server_test.go b/server_test.go index b7430138..fd6a4d0e 100644 --- a/server_test.go +++ b/server_test.go @@ -302,6 +302,31 @@ func TestServingLargeResponses(t *testing.T) { } } +func TestServingResponse(t *testing.T) { + HandleFunc("miek.nl.", HelloServer) + s, addrstr, err := RunLocalUDPServer("127.0.0.1:0") + if err != nil { + t.Fatalf("Unable to run test server: %s", err) + } + defer s.Shutdown() + + c := new(Client) + m := new(Msg) + m.SetQuestion("miek.nl.", TypeTXT) + m.Response = false + _, _, err = c.Exchange(m, addrstr) + if err != nil { + t.Log("failed to exchange", err) + t.Fatal() + } + m.Response = true + _, _, err = c.Exchange(m, addrstr) + if err == nil { + t.Log("exchanged response message", err) + t.Fatal() + } +} + func TestShutdownTCP(t *testing.T) { s, _, err := RunLocalTCPServer("127.0.0.1:0") if err != nil {