error.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package krpc
  2. import (
  3. "fmt"
  4. "github.com/anacrolix/torrent/bencode"
  5. )
  6. const (
  7. // These are documented in BEP 5.
  8. ErrorCodeGenericError = 201
  9. ErrorCodeServerError = 202
  10. ErrorCodeProtocolError = 203
  11. ErrorCodeMethodUnknown = 204
  12. // BEP 44
  13. ErrorCodeMessageValueFieldTooBig = 205
  14. ErrorCodeInvalidSignature = 206
  15. ErrorCodeSaltFieldTooBig = 207
  16. ErrorCodeCasHashMismatched = 301
  17. ErrorCodeSequenceNumberLessThanCurrent = 302
  18. )
  19. var ErrorMethodUnknown = Error{
  20. Code: ErrorCodeMethodUnknown,
  21. Msg: "Method Unknown",
  22. }
  23. // Represented as a string or list in bencode.
  24. type Error struct {
  25. Code int
  26. Msg string
  27. }
  28. var (
  29. _ bencode.Unmarshaler = (*Error)(nil)
  30. _ bencode.Marshaler = (*Error)(nil)
  31. _ error = Error{}
  32. )
  33. func (e *Error) UnmarshalBencode(_b []byte) (err error) {
  34. var _v interface{}
  35. err = bencode.Unmarshal(_b, &_v)
  36. if err != nil {
  37. return
  38. }
  39. switch v := _v.(type) {
  40. case []interface{}:
  41. func() {
  42. defer func() {
  43. r := recover()
  44. if r == nil {
  45. return
  46. }
  47. err = fmt.Errorf("unpacking %#v: %s", v, r)
  48. }()
  49. e.Code = int(v[0].(int64))
  50. e.Msg = v[1].(string)
  51. }()
  52. case string:
  53. e.Msg = v
  54. default:
  55. err = fmt.Errorf(`KRPC error bencode value has unexpected type: %T`, _v)
  56. }
  57. return
  58. }
  59. func (e Error) MarshalBencode() (ret []byte, err error) {
  60. return bencode.Marshal([]interface{}{e.Code, e.Msg})
  61. }
  62. func (e Error) Error() string {
  63. return fmt.Sprintf("KRPC error %d: %s", e.Code, e.Msg)
  64. }