frame.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package cli
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "io"
  6. "math"
  7. "time"
  8. )
  9. const (
  10. PacketTypeCompleter byte = 0x01
  11. PacketTypeCommand = 0x02
  12. PacketTypeHandshake = 0x03
  13. )
  14. const (
  15. FlagPortion = 0x00
  16. FlagComplete = 0x01
  17. )
  18. type (
  19. Frame struct {
  20. Feature []byte
  21. Type byte `json:"type"`
  22. Flag byte `json:"flag"`
  23. Seq uint16 `json:"seq"`
  24. Data []byte `json:"data"`
  25. Error string `json:"error"`
  26. Timestamp int64 `json:"timestamp"`
  27. }
  28. )
  29. func readFrame(r io.Reader) (frame *Frame, err error) {
  30. var (
  31. n int
  32. dataLength uint16
  33. errorLength uint16
  34. errBuf []byte
  35. )
  36. frame = &Frame{Feature: make([]byte, 3)}
  37. if _, err = io.ReadFull(r, frame.Feature); err != nil {
  38. return
  39. }
  40. if !bytes.Equal(frame.Feature, Feature) {
  41. err = io.ErrUnexpectedEOF
  42. return
  43. }
  44. if err = binary.Read(r, binary.LittleEndian, &frame.Type); err != nil {
  45. return
  46. }
  47. if err = binary.Read(r, binary.LittleEndian, &frame.Flag); err != nil {
  48. return
  49. }
  50. if err = binary.Read(r, binary.LittleEndian, &frame.Seq); err != nil {
  51. return
  52. }
  53. if err = binary.Read(r, binary.LittleEndian, &frame.Timestamp); err != nil {
  54. return
  55. }
  56. if err = binary.Read(r, binary.LittleEndian, &dataLength); err != nil {
  57. return
  58. }
  59. if err = binary.Read(r, binary.LittleEndian, &errorLength); err != nil {
  60. return
  61. }
  62. if dataLength > 0 {
  63. frame.Data = make([]byte, dataLength)
  64. if n, err = io.ReadFull(r, frame.Data); err == nil {
  65. if n < int(dataLength) {
  66. err = io.ErrShortBuffer
  67. }
  68. }
  69. }
  70. if errorLength > 0 {
  71. errBuf = make([]byte, errorLength)
  72. if n, err = io.ReadFull(r, errBuf); err == nil {
  73. if n < int(dataLength) {
  74. err = io.ErrShortBuffer
  75. } else {
  76. frame.Error = string(errBuf)
  77. }
  78. }
  79. }
  80. return
  81. }
  82. func writeFrame(w io.Writer, frame *Frame) (err error) {
  83. var (
  84. n int
  85. dl int
  86. dataLength uint16
  87. errorLength uint16
  88. errBuf []byte
  89. )
  90. if _, err = w.Write(Feature); err != nil {
  91. return
  92. }
  93. if frame.Data != nil {
  94. dl = len(frame.Data)
  95. if dl > math.MaxUint16 {
  96. return io.ErrNoProgress
  97. }
  98. dataLength = uint16(dl)
  99. }
  100. if frame.Error != "" {
  101. errBuf = []byte(frame.Error)
  102. errorLength = uint16(len(errBuf))
  103. }
  104. if err = binary.Write(w, binary.LittleEndian, frame.Type); err != nil {
  105. return
  106. }
  107. if err = binary.Write(w, binary.LittleEndian, frame.Flag); err != nil {
  108. return
  109. }
  110. if err = binary.Write(w, binary.LittleEndian, frame.Seq); err != nil {
  111. return
  112. }
  113. if err = binary.Write(w, binary.LittleEndian, frame.Timestamp); err != nil {
  114. return
  115. }
  116. if err = binary.Write(w, binary.LittleEndian, dataLength); err != nil {
  117. return
  118. }
  119. if err = binary.Write(w, binary.LittleEndian, errorLength); err != nil {
  120. return
  121. }
  122. if dataLength > 0 {
  123. if n, err = w.Write(frame.Data); err == nil {
  124. if n < int(dataLength) {
  125. err = io.ErrShortWrite
  126. }
  127. }
  128. }
  129. if errorLength > 0 {
  130. if n, err = w.Write(errBuf); err == nil {
  131. if n < int(errorLength) {
  132. err = io.ErrShortWrite
  133. }
  134. }
  135. }
  136. return
  137. }
  138. func newFrame(t, f byte, seq uint16, data []byte) *Frame {
  139. return &Frame{
  140. Feature: Feature,
  141. Type: t,
  142. Flag: f,
  143. Seq: seq,
  144. Data: data,
  145. Timestamp: time.Now().Unix(),
  146. }
  147. }