From e80846998ce8b420068177f27ed917869232e1c4 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 13 Dec 2016 14:45:40 +1100 Subject: [PATCH] dht: Reply with Method Unknown error to unknown query methods received --- dht/krpc/error.go | 5 +++++ dht/server.go | 21 +++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/dht/krpc/error.go b/dht/krpc/error.go index fddd0f48..d4b248a7 100644 --- a/dht/krpc/error.go +++ b/dht/krpc/error.go @@ -6,6 +6,11 @@ import ( "github.com/anacrolix/torrent/bencode" ) +var ErrorMethodUnknown = KRPCError{ + Code: 204, + Msg: "Method Unknown", +} + // Represented as a string or list in bencode. type KRPCError struct { Code int diff --git a/dht/server.go b/dht/server.go index 7e910979..14042c6e 100644 --- a/dht/server.go +++ b/dht/server.go @@ -333,11 +333,24 @@ func (s *Server) handleQuery(source Addr, m krpc.Msg) { } go h(ih, p) } - case "vote": - // TODO(anacrolix): Or reject, I don't think I want this. default: - log.Printf("%s: not handling received query: q=%s", s, m.Q) - return + s.sendError(source, m.T, krpc.ErrorMethodUnknown) + } +} + +func (s *Server) sendError(addr Addr, t string, e krpc.KRPCError) { + m := krpc.Msg{ + T: t, + Y: "e", + E: &e, + } + b, err := bencode.Marshal(m) + if err != nil { + panic(err) + } + err = s.writeToNode(b, addr) + if err != nil { + log.Printf("error replying to %s: %s", addr, err) } } -- 2.48.1