58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
|
package http
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/anacrolix/dht/v2/krpc"
|
||
|
"github.com/anacrolix/torrent/bencode"
|
||
|
)
|
||
|
|
||
|
type HttpResponse struct {
|
||
|
FailureReason string `bencode:"failure reason"`
|
||
|
Interval int32 `bencode:"interval"`
|
||
|
TrackerId string `bencode:"tracker id"`
|
||
|
Complete int32 `bencode:"complete"`
|
||
|
Incomplete int32 `bencode:"incomplete"`
|
||
|
Peers Peers `bencode:"peers"`
|
||
|
// BEP 7
|
||
|
Peers6 krpc.CompactIPv6NodeAddrs `bencode:"peers6"`
|
||
|
}
|
||
|
|
||
|
type Peers []Peer
|
||
|
|
||
|
func (me *Peers) UnmarshalBencode(b []byte) (err error) {
|
||
|
var _v interface{}
|
||
|
err = bencode.Unmarshal(b, &_v)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
switch v := _v.(type) {
|
||
|
case string:
|
||
|
vars.Add("http responses with string peers", 1)
|
||
|
var cnas krpc.CompactIPv4NodeAddrs
|
||
|
err = cnas.UnmarshalBinary([]byte(v))
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
for _, cp := range cnas {
|
||
|
*me = append(*me, Peer{
|
||
|
IP: cp.IP[:],
|
||
|
Port: int(cp.Port),
|
||
|
})
|
||
|
}
|
||
|
return
|
||
|
case []interface{}:
|
||
|
vars.Add("http responses with list peers", 1)
|
||
|
for _, i := range v {
|
||
|
var p Peer
|
||
|
p.FromDictInterface(i.(map[string]interface{}))
|
||
|
*me = append(*me, p)
|
||
|
}
|
||
|
return
|
||
|
default:
|
||
|
vars.Add("http responses with unhandled peers type", 1)
|
||
|
err = fmt.Errorf("unsupported type: %T", _v)
|
||
|
return
|
||
|
}
|
||
|
}
|