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