packet.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package parser
  2. import (
  3. "encoding/base64"
  4. "fmt"
  5. "io"
  6. "github.com/googollee/go-engine.io/message"
  7. )
  8. // PacketType is the type of packet
  9. type PacketType string
  10. const (
  11. OPEN PacketType = "open"
  12. CLOSE PacketType = "close"
  13. PING PacketType = "ping"
  14. PONG PacketType = "pong"
  15. MESSAGE PacketType = "message"
  16. UPGRADE PacketType = "upgrade"
  17. NOOP PacketType = "noop"
  18. )
  19. func ByteToType(b byte) (PacketType, error) {
  20. switch b {
  21. case 0:
  22. return OPEN, nil
  23. case 1:
  24. return CLOSE, nil
  25. case 2:
  26. return PING, nil
  27. case 3:
  28. return PONG, nil
  29. case 4:
  30. return MESSAGE, nil
  31. case 5:
  32. return UPGRADE, nil
  33. case 6:
  34. return NOOP, nil
  35. }
  36. return NOOP, fmt.Errorf("invalid byte 0x%x", b)
  37. }
  38. // Byte return the byte of type
  39. func (t PacketType) Byte() byte {
  40. switch t {
  41. case OPEN:
  42. return 0
  43. case CLOSE:
  44. return 1
  45. case PING:
  46. return 2
  47. case PONG:
  48. return 3
  49. case MESSAGE:
  50. return 4
  51. case UPGRADE:
  52. return 5
  53. }
  54. return 6
  55. }
  56. // packetEncoder is the encoder which encode the packet.
  57. type PacketEncoder struct {
  58. closer io.Closer
  59. w io.Writer
  60. }
  61. // NewStringEncoder return the encoder which encode type t to writer w, as string.
  62. func NewStringEncoder(w io.Writer, t PacketType) (*PacketEncoder, error) {
  63. return newEncoder(w, t.Byte()+'0')
  64. }
  65. // NewBinaryEncoder return the encoder which encode type t to writer w, as binary.
  66. func NewBinaryEncoder(w io.Writer, t PacketType) (*PacketEncoder, error) {
  67. return newEncoder(w, t.Byte())
  68. }
  69. func newEncoder(w io.Writer, t byte) (*PacketEncoder, error) {
  70. if _, err := w.Write([]byte{t}); err != nil {
  71. return nil, err
  72. }
  73. closer, ok := w.(io.Closer)
  74. if !ok {
  75. closer = nil
  76. }
  77. return &PacketEncoder{
  78. closer: closer,
  79. w: w,
  80. }, nil
  81. }
  82. // NewB64Encoder return the encoder which encode type t to writer w, as string. When write binary, it uses base64.
  83. func NewB64Encoder(w io.Writer, t PacketType) (*PacketEncoder, error) {
  84. _, err := w.Write([]byte{'b', t.Byte() + '0'})
  85. if err != nil {
  86. return nil, err
  87. }
  88. base := base64.NewEncoder(base64.StdEncoding, w)
  89. return &PacketEncoder{
  90. closer: base,
  91. w: base,
  92. }, nil
  93. }
  94. // Write writes bytes p.
  95. func (e *PacketEncoder) Write(p []byte) (int, error) {
  96. return e.w.Write(p)
  97. }
  98. // Close closes the encoder.
  99. func (e *PacketEncoder) Close() error {
  100. if e.closer != nil {
  101. return e.closer.Close()
  102. }
  103. return nil
  104. }
  105. // packetDecoder is the decoder which decode data to packet.
  106. type PacketDecoder struct {
  107. closer io.Closer
  108. r io.Reader
  109. t PacketType
  110. msgType message.MessageType
  111. }
  112. // NewDecoder return the decoder which decode from reader r.
  113. func NewDecoder(r io.Reader) (*PacketDecoder, error) {
  114. var closer io.Closer
  115. if limit, ok := r.(*limitReader); ok {
  116. closer = limit
  117. }
  118. defer func() {
  119. if closer != nil {
  120. closer.Close()
  121. }
  122. }()
  123. b := []byte{0xff}
  124. if _, err := r.Read(b); err != nil {
  125. return nil, err
  126. }
  127. msgType := message.MessageText
  128. if b[0] == 'b' {
  129. if _, err := r.Read(b); err != nil {
  130. return nil, err
  131. }
  132. r = base64.NewDecoder(base64.StdEncoding, r)
  133. msgType = message.MessageBinary
  134. }
  135. if b[0] >= '0' {
  136. b[0] = b[0] - '0'
  137. } else {
  138. msgType = message.MessageBinary
  139. }
  140. t, err := ByteToType(b[0])
  141. if err != nil {
  142. return nil, err
  143. }
  144. ret := &PacketDecoder{
  145. closer: closer,
  146. r: r,
  147. t: t,
  148. msgType: msgType,
  149. }
  150. closer = nil
  151. return ret, nil
  152. }
  153. // Read reads packet data to bytes p.
  154. func (d *PacketDecoder) Read(p []byte) (int, error) {
  155. return d.r.Read(p)
  156. }
  157. // Type returns the type of packet.
  158. func (d *PacketDecoder) Type() PacketType {
  159. return d.t
  160. }
  161. // MessageType returns the type of message, binary or string.
  162. func (d *PacketDecoder) MessageType() message.MessageType {
  163. return d.msgType
  164. }
  165. // Close closes the decoder.
  166. func (d *PacketDecoder) Close() error {
  167. if d.closer != nil {
  168. return d.closer.Close()
  169. }
  170. return nil
  171. }