aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-18 00:51:43 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-18 00:51:43 +0200
commite4b008b534de791b10864cbb4cab34fcee471c34 (patch)
treecb950fc35cebb44da4837e78377bbe868a520d75
parent0d3592231c8eae65fbd7e479763639fd7524dbf7 (diff)
wip, broken
-rw-r--r--bencode/bdecode.go11
-rw-r--r--tracker/messages.go23
-rw-r--r--tracker/messages_test.go2
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)