6 "github.com/anacrolix/dht/v2/krpc"
8 "github.com/anacrolix/torrent/bencode"
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"`
19 Peers6 krpc.CompactIPv6NodeAddrs `bencode:"peers6"`
27 func (me Peers) MarshalBencode() ([]byte, error) {
29 cnas := make([]krpc.NodeAddr, 0, len(me.List))
30 for _, peer := range me.List {
31 cnas = append(cnas, krpc.NodeAddr{
36 return krpc.CompactIPv4NodeAddrs(cnas).MarshalBencode()
38 return bencode.Marshal(me.List)
43 _ bencode.Unmarshaler = (*Peers)(nil)
44 _ bencode.Marshaler = Peers{}
47 func (me *Peers) UnmarshalBencode(b []byte) (err error) {
49 err = bencode.Unmarshal(b, &_v)
53 switch v := _v.(type) {
55 vars.Add("http responses with string peers", 1)
56 var cnas krpc.CompactIPv4NodeAddrs
57 err = cnas.UnmarshalBinary([]byte(v))
62 for _, cp := range cnas {
63 me.List = append(me.List, Peer{
70 vars.Add("http responses with list peers", 1)
74 p.FromDictInterface(i.(map[string]interface{}))
75 me.List = append(me.List, p)
79 vars.Add("http responses with unhandled peers type", 1)
80 err = fmt.Errorf("unsupported type: %T", _v)