From 723c7ae2fb6680a36cd507514c1e90d40d83d334 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 25 Jul 2016 20:24:32 +0200 Subject: Paremtrize Tokens --- bencode/bdecode.go | 27 +++++++++++++++++---------- tracker/messages.go | 15 +++++++++++++-- tracker/peer.go | 2 +- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/bencode/bdecode.go b/bencode/bdecode.go index bda3dd7..9bd57b9 100644 --- a/bencode/bdecode.go +++ b/bencode/bdecode.go @@ -8,6 +8,13 @@ import ( "time" ) +const ( + Dict = 'd' + List = 'l' + Int = 'i' + end = 'e' +) + type Unmarshaler interface { UnmarshalBencode([]byte) (int, error) } @@ -31,13 +38,13 @@ func Unmarshal(data []byte, v interface{}) (int, error) { func (d *decodeState) unmarshalField(v reflect.Value) error { switch d.data[d.off] { - case 'd': + case Dict: return d.unmarshalDict(v) - case 'i': + case Int: return d.unmarshalInt(v) - case 'l': + case List: return d.unmarshalList(v) - case 'e': + case end: return ErrValue default: return d.unmarshalString(v) @@ -46,14 +53,14 @@ func (d *decodeState) unmarshalField(v reflect.Value) error { } func (d *decodeState) unmarshalDict(v reflect.Value) error { - if d.data[d.off] != 'd' { + if d.data[d.off] != Dict { return ErrValue } rawStart := d.off d.off++ - for d.data[d.off] != 'e' { + for d.data[d.off] != end { key, n := parseString(d.data[d.off:]) d.off += n val := findKey(key, v) @@ -81,12 +88,12 @@ func (d *decodeState) unmarshalDict(v reflect.Value) error { } func (d *decodeState) unmarshalList(v reflect.Value) error { - if d.data[d.off] != 'l' { + if d.data[d.off] != List { return ErrValue } d.off++ - for i := 0; d.data[d.off] != 'e'; i++ { + for i := 0; d.data[d.off] != end; i++ { if v.CanSet() { if i >= v.Cap() { newcap := v.Cap() + v.Cap()/2 @@ -166,10 +173,10 @@ func parseString(data []byte) (string, int) { } func parseInt(data []byte) (int64, int) { - if data[0] != 'i' { + if data[0] != Int { panic("not an int") } - end := bytes.IndexByte(data, 'e') + end := bytes.IndexByte(data, end) i, err := strconv.Atoi(string(data[1:end])) if err != nil { panic(err) diff --git a/tracker/messages.go b/tracker/messages.go index 3c739e8..67c49c3 100644 --- a/tracker/messages.go +++ b/tracker/messages.go @@ -42,7 +42,7 @@ type Request struct { // we support only compact mode type Response struct { Complete int `bencode:"complete"` - FalureReason string `bencode:"failure reason"` + FailureReason string `bencode:"failure reason"` Incomplete int `bencode:"incomplete"` Interval time.Duration `bencode:"interval"` MinInterval time.Duration `bencode:"min interval"` @@ -62,11 +62,22 @@ func (r *Request) Poll(announce string) chan Peer { log.Println(err) return } + if msg := resp.WarningMessage; msg != "" { + log.Println("warning:", msg) + } + if msg := resp.FailureReason; msg != "" { + log.Println("failure:", msg) + return + } for _, p := range resp.Peers { c <- p } if resp.Interval == 0 { - resp.Interval = DefaultInterval + if resp.MinInterval > 0 { + resp.Interval = resp.MinInterval + } else { + resp.Interval = DefaultInterval + } } log.Println("waiting", resp.Interval) time.Sleep(resp.Interval) diff --git a/tracker/peer.go b/tracker/peer.go index e19b5c3..74fd90c 100644 --- a/tracker/peer.go +++ b/tracker/peer.go @@ -28,7 +28,7 @@ type Peers []Peer func (p *Peers) UnmarshalBencode(b []byte) (int, error) { switch b[0] { - case 'l': + case bencode.List: var tmp []Peer n, err := bencode.Unmarshal(b, &tmp) *p = Peers(tmp) -- cgit v1.2.3