conn.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package proto
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "fmt"
  6. "ngrok/conn"
  7. )
  8. func readMsgShared(c conn.Conn) (buffer []byte, err error) {
  9. c.Debug("Waiting to read message")
  10. var sz int64
  11. err = binary.Read(c, binary.LittleEndian, &sz)
  12. if err != nil {
  13. return
  14. }
  15. c.Debug("Reading message with length: %d", sz)
  16. buffer = make([]byte, sz)
  17. n, err := c.Read(buffer)
  18. c.Debug("Read message %s", buffer)
  19. if err != nil {
  20. return
  21. }
  22. if int64(n) != sz {
  23. err = errors.New(fmt.Sprintf("Expected to read %d bytes, but only read %d", sz, n))
  24. return
  25. }
  26. return
  27. }
  28. func ReadMsg(c conn.Conn) (msg Message, err error) {
  29. buffer, err := readMsgShared(c)
  30. if err != nil {
  31. return
  32. }
  33. return Unpack(buffer)
  34. }
  35. func ReadMsgInto(c conn.Conn, msg Message) (err error) {
  36. buffer, err := readMsgShared(c)
  37. if err != nil {
  38. return
  39. }
  40. return UnpackInto(buffer, msg)
  41. }
  42. func WriteMsg(c conn.Conn, msg interface{}) (err error) {
  43. buffer, err := Pack(msg)
  44. if err != nil {
  45. return
  46. }
  47. c.Debug("Writing message: %s", string(buffer))
  48. err = binary.Write(c, binary.LittleEndian, int64(len(buffer)))
  49. if err != nil {
  50. return
  51. }
  52. if _, err = c.Write(buffer); err != nil {
  53. return
  54. }
  55. return nil
  56. }