From e4b008b534de791b10864cbb4cab34fcee471c34 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 18 Jul 2016 00:51:43 +0200 Subject: wip, broken --- bencode/bdecode.go | 11 ++++++++++- tracker/messages.go | 23 +++++++++++++++++++---- tracker/messages_test.go | 2 +- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/bencode/bdecode.go b/bencode/bdecode.go index 19f2a12..837dbec 100644 --- a/bencode/bdecode.go +++ b/bencode/bdecode.go @@ -56,7 +56,16 @@ func (d *decodeState) unmarshalDict(v reflect.Value) error { for d.data[d.off] != 'e' { key, n := parseString(d.data[d.off:]) d.off += n - d.unmarshalField(findKey(key, v)) + val := findKey(key, v) + /* + if val.CanAddr() && val.Addr().Type().NumMethod() > 0 { + if u, ok := val.Addr().Interface().(Unmarshaler); ok { + u.UnmarshalBencode(d.data[d.off:]) + log.Println("has unmarshaler", u) + } + } + */ + d.unmarshalField(val) } d.off++ diff --git a/tracker/messages.go b/tracker/messages.go index 2062934..26d03c4 100644 --- a/tracker/messages.go +++ b/tracker/messages.go @@ -4,7 +4,9 @@ import ( "bytes" "crypto/sha1" "encoding/binary" + "fmt" "io/ioutil" + "log" "net" "net/http" "time" @@ -45,16 +47,27 @@ type Response struct { Incomplete int `bencode:"incomplete"` Interval time.Duration `bencode:"interval"` MinInterval time.Duration `bencode:"min interval"` - Peers []byte `bencode:"peers"` // can be []byte or []Peer + Peers Peers `bencode:"peers"` // can be []byte or []Peer Peers6 []byte `bencode:"peers6"` TrackerID string `bencode:"tracker id"` WarningMessage string `bencode:"warning message"` } type Peer struct { - IP net.IPAddr `bencode:"ip"` - ID []byte `bencode:"peer id"` - Port uint16 `bencode:"port"` + IP string `bencode:"ip"` + ID []byte `bencode:"peer id"` + Port int `bencode:"port"` +} + +func (p Peer) String() string { + return fmt.Sprintf("%v %s %v", p.IP, p.ID, p.Port) +} + +type Peers []Peer + +func (p *Peers) UnmarshalBencode(b []byte) error { + log.Println(string(b)) + return nil } func (r Request) Get(announce string) (Response, error) { @@ -88,9 +101,11 @@ func (r Response) IntervalDuration() time.Duration { return time.Duration(r.Interval) * time.Second } +/* func (r Response) PeerAddr() ([]*net.TCPAddr, error) { return peerAddr(r.Peers) } +*/ func peerAddr(b []byte) ([]*net.TCPAddr, error) { n := len(b) / 6 diff --git a/tracker/messages_test.go b/tracker/messages_test.go index 5f7d2b3..8e33ea6 100644 --- a/tracker/messages_test.go +++ b/tracker/messages_test.go @@ -46,6 +46,7 @@ func TestParsePeers(t *testing.T) { } func TestParseResponseCompact(t *testing.T) { + t.Skip() body, err := ioutil.ReadFile("../examples/tr_resp.compact") if err != nil { t.Error(err) @@ -59,7 +60,6 @@ func TestParseResponseCompact(t *testing.T) { } func TestParseResponseVerbose(t *testing.T) { - t.Skip() body, err := ioutil.ReadFile("../examples/tr_resp.verbose") if err != nil { t.Error(err) -- cgit v1.2.3