| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package krpc
- import (
- "fmt"
- "github.com/anacrolix/torrent/bencode"
- )
- const (
- // These are documented in BEP 5.
- ErrorCodeGenericError = 201
- ErrorCodeServerError = 202
- ErrorCodeProtocolError = 203
- ErrorCodeMethodUnknown = 204
- // BEP 44
- ErrorCodeMessageValueFieldTooBig = 205
- ErrorCodeInvalidSignature = 206
- ErrorCodeSaltFieldTooBig = 207
- ErrorCodeCasHashMismatched = 301
- ErrorCodeSequenceNumberLessThanCurrent = 302
- )
- var ErrorMethodUnknown = Error{
- Code: ErrorCodeMethodUnknown,
- Msg: "Method Unknown",
- }
- // Represented as a string or list in bencode.
- type Error struct {
- Code int
- Msg string
- }
- var (
- _ bencode.Unmarshaler = (*Error)(nil)
- _ bencode.Marshaler = (*Error)(nil)
- _ error = Error{}
- )
- func (e *Error) UnmarshalBencode(_b []byte) (err error) {
- var _v interface{}
- err = bencode.Unmarshal(_b, &_v)
- if err != nil {
- return
- }
- switch v := _v.(type) {
- case []interface{}:
- func() {
- defer func() {
- r := recover()
- if r == nil {
- return
- }
- err = fmt.Errorf("unpacking %#v: %s", v, r)
- }()
- e.Code = int(v[0].(int64))
- e.Msg = v[1].(string)
- }()
- case string:
- e.Msg = v
- default:
- err = fmt.Errorf(`KRPC error bencode value has unexpected type: %T`, _v)
- }
- return
- }
- func (e Error) MarshalBencode() (ret []byte, err error) {
- return bencode.Marshal([]interface{}{e.Code, e.Msg})
- }
- func (e Error) Error() string {
- return fmt.Sprintf("KRPC error %d: %s", e.Code, e.Msg)
- }
|