]> Sergey Matveev's repositories - btrtrc.git/blob - tracker/http/protocol.go
0a54a1b3003a094d640dde936c736168f5bbb4c2
[btrtrc.git] / tracker / http / protocol.go
1 package http
2
3 import (
4         "fmt"
5
6         "github.com/anacrolix/dht/v2/krpc"
7         "github.com/anacrolix/torrent/bencode"
8 )
9
10 type HttpResponse struct {
11         FailureReason string `bencode:"failure reason"`
12         Interval      int32  `bencode:"interval"`
13         TrackerId     string `bencode:"tracker id"`
14         Complete      int32  `bencode:"complete"`
15         Incomplete    int32  `bencode:"incomplete"`
16         Peers         Peers  `bencode:"peers"`
17         // BEP 7
18         Peers6 krpc.CompactIPv6NodeAddrs `bencode:"peers6"`
19 }
20
21 type Peers []Peer
22
23 func (me *Peers) UnmarshalBencode(b []byte) (err error) {
24         var _v interface{}
25         err = bencode.Unmarshal(b, &_v)
26         if err != nil {
27                 return
28         }
29         switch v := _v.(type) {
30         case string:
31                 vars.Add("http responses with string peers", 1)
32                 var cnas krpc.CompactIPv4NodeAddrs
33                 err = cnas.UnmarshalBinary([]byte(v))
34                 if err != nil {
35                         return
36                 }
37                 for _, cp := range cnas {
38                         *me = append(*me, Peer{
39                                 IP:   cp.IP[:],
40                                 Port: int(cp.Port),
41                         })
42                 }
43                 return
44         case []interface{}:
45                 vars.Add("http responses with list peers", 1)
46                 for _, i := range v {
47                         var p Peer
48                         p.FromDictInterface(i.(map[string]interface{}))
49                         *me = append(*me, p)
50                 }
51                 return
52         default:
53                 vars.Add("http responses with unhandled peers type", 1)
54                 err = fmt.Errorf("unsupported type: %T", _v)
55                 return
56         }
57 }