protocol.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright (C) 2015 Audrius Butkevicius and Contributors (see the CONTRIBUTORS file).
  2. package protocol
  3. import (
  4. "fmt"
  5. "io"
  6. )
  7. const (
  8. magic = 0x9E79BC40
  9. ProtocolName = "bep-relay"
  10. )
  11. var (
  12. ResponseSuccess = Response{0, "success"}
  13. ResponseNotFound = Response{1, "not found"}
  14. ResponseAlreadyConnected = Response{2, "already connected"}
  15. ResponseInternalError = Response{99, "internal error"}
  16. ResponseUnexpectedMessage = Response{100, "unexpected message"}
  17. )
  18. func WriteMessage(w io.Writer, message interface{}) error {
  19. header := header{
  20. magic: magic,
  21. }
  22. var payload []byte
  23. var err error
  24. switch msg := message.(type) {
  25. case Ping:
  26. payload, err = msg.MarshalXDR()
  27. header.messageType = messageTypePing
  28. case Pong:
  29. payload, err = msg.MarshalXDR()
  30. header.messageType = messageTypePong
  31. case JoinRelayRequest:
  32. payload, err = msg.MarshalXDR()
  33. header.messageType = messageTypeJoinRelayRequest
  34. case JoinSessionRequest:
  35. payload, err = msg.MarshalXDR()
  36. header.messageType = messageTypeJoinSessionRequest
  37. case Response:
  38. payload, err = msg.MarshalXDR()
  39. header.messageType = messageTypeResponse
  40. case ConnectRequest:
  41. payload, err = msg.MarshalXDR()
  42. header.messageType = messageTypeConnectRequest
  43. case SessionInvitation:
  44. payload, err = msg.MarshalXDR()
  45. header.messageType = messageTypeSessionInvitation
  46. case RelayFull:
  47. payload, err = msg.MarshalXDR()
  48. header.messageType = messageTypeRelayFull
  49. default:
  50. err = fmt.Errorf("Unknown message type")
  51. }
  52. if err != nil {
  53. return err
  54. }
  55. header.messageLength = int32(len(payload))
  56. headerpayload, err := header.MarshalXDR()
  57. if err != nil {
  58. return err
  59. }
  60. _, err = w.Write(append(headerpayload, payload...))
  61. return err
  62. }
  63. func ReadMessage(r io.Reader) (interface{}, error) {
  64. var header header
  65. if err := header.DecodeXDR(r); err != nil {
  66. return nil, err
  67. }
  68. if header.magic != magic {
  69. return nil, fmt.Errorf("magic mismatch")
  70. }
  71. switch header.messageType {
  72. case messageTypePing:
  73. var msg Ping
  74. err := msg.DecodeXDR(r)
  75. return msg, err
  76. case messageTypePong:
  77. var msg Pong
  78. err := msg.DecodeXDR(r)
  79. return msg, err
  80. case messageTypeJoinRelayRequest:
  81. var msg JoinRelayRequest
  82. err := msg.DecodeXDR(r)
  83. return msg, err
  84. case messageTypeJoinSessionRequest:
  85. var msg JoinSessionRequest
  86. err := msg.DecodeXDR(r)
  87. return msg, err
  88. case messageTypeResponse:
  89. var msg Response
  90. err := msg.DecodeXDR(r)
  91. return msg, err
  92. case messageTypeConnectRequest:
  93. var msg ConnectRequest
  94. err := msg.DecodeXDR(r)
  95. return msg, err
  96. case messageTypeSessionInvitation:
  97. var msg SessionInvitation
  98. err := msg.DecodeXDR(r)
  99. return msg, err
  100. case messageTypeRelayFull:
  101. var msg RelayFull
  102. err := msg.DecodeXDR(r)
  103. return msg, err
  104. }
  105. return nil, fmt.Errorf("Unknown message type")
  106. }