tcp_protocol.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package plugin_manager
  2. import (
  3. "bytes"
  4. "errors"
  5. "github.com/panjf2000/gnet/v2"
  6. )
  7. type codec struct {
  8. buf bytes.Buffer
  9. }
  10. func (w *codec) Decode(c gnet.Conn) ([][]byte, error) {
  11. size := c.InboundBuffered()
  12. buf := make([]byte, size)
  13. read, err := c.Read(buf)
  14. if err != nil {
  15. return nil, err
  16. }
  17. if read < size {
  18. return nil, errors.New("read less than size")
  19. }
  20. // use \ as escape character, as for \ itself, it should be escaped as well
  21. var start int
  22. var result [][]byte = make([][]byte, 0)
  23. var current_line []byte = make([]byte, 0)
  24. for i := 0; i < size; i++ {
  25. if buf[i] == '\\' {
  26. // write to current line
  27. current_line = append(current_line, buf[start:i]...)
  28. start = i + 1
  29. i++
  30. continue
  31. }
  32. if buf[i] == '\n' {
  33. // write to current line
  34. current_line = append(current_line, buf[start:i]...)
  35. result = append(result, current_line)
  36. current_line = make([]byte, 0)
  37. start = i + 1
  38. }
  39. }
  40. // for the last line, write it to buffer
  41. if start < size {
  42. w.buf.Write(buf[start:size])
  43. }
  44. return result, nil
  45. }