aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-25 20:24:32 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-25 20:24:32 +0200
commit723c7ae2fb6680a36cd507514c1e90d40d83d334 (patch)
tree8cccf95b9eddcb6f8b3d8da2f5782b5357a98b5b
parenta916155668a0e5ed117f4bf362d0afff872647d8 (diff)
Paremtrize Tokens
-rw-r--r--bencode/bdecode.go27
-rw-r--r--tracker/messages.go15
-rw-r--r--tracker/peer.go2
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)