From 8baadf0af35e39064dc275edff05f580352c4a5c Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Sat, 14 Dec 2013 22:20:13 +1100 Subject: [PATCH] Fix parsing of UDP announce response peers --- tracker/udp/udp_tracker.go | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/tracker/udp/udp_tracker.go b/tracker/udp/udp_tracker.go index 13800d13..1bb57b37 100644 --- a/tracker/udp/udp_tracker.go +++ b/tracker/udp/udp_tracker.go @@ -91,18 +91,25 @@ func (c *client) Announce(req *tracker.AnnounceRequest) (res tracker.AnnounceRes if err != nil { return } - var ( - h AnnounceResponseHeader - ps []Peer - ) - err = readBody(b, &h, &ps) + var h AnnounceResponseHeader + err = readBody(b, &h) if err != nil { return } res.Interval = h.Interval res.Leechers = h.Leechers res.Seeders = h.Seeders - for _, p := range ps { + for { + var p Peer + err = binary.Read(b, binary.BigEndian, &p) + switch err { + case nil: + case io.EOF: + err = nil + fallthrough + default: + return + } res.Peers = append(res.Peers, tracker.Peer{ IP: p.IP[:], Port: int(p.Port), @@ -131,7 +138,7 @@ func (c *client) write(h *RequestHeader, body interface{}) (err error) { return } -func (c *client) request(action Action, args interface{}) (responseBody []byte, err error) { +func (c *client) request(action Action, args interface{}) (responseBody *bytes.Reader, err error) { tid := newTransactionId() err = c.write(&RequestHeader{ ConnectionId: c.connectionId, @@ -172,13 +179,15 @@ func (c *client) request(action Action, args interface{}) (responseBody []byte, continue } c.contiguousTimeouts = 0 - responseBody = buf.Bytes() + if h.Action == Error { + err = errors.New(buf.String()) + } + responseBody = bytes.NewReader(buf.Bytes()) return } } -func readBody(b []byte, data ...interface{}) (err error) { - r := bytes.NewReader(b) +func readBody(r *bytes.Reader, data ...interface{}) (err error) { for _, datum := range data { err = binary.Read(r, binary.BigEndian, datum) if err != nil { -- 2.48.1