packetDecoder.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package kafka
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "math"
  6. )
  7. type packetDecoder struct {
  8. raw []byte
  9. off int
  10. }
  11. func (pd *packetDecoder) avail() int {
  12. return len(pd.raw) - pd.off
  13. }
  14. func (pd *packetDecoder) getInt16() (int16, error) {
  15. if pd.avail() < 2 {
  16. return -1, errors.New("kafka getInt16: not enough data")
  17. }
  18. tmp := int16(binary.BigEndian.Uint16(pd.raw[pd.off:]))
  19. pd.off += 2
  20. return tmp, nil
  21. }
  22. func (pd *packetDecoder) getInt32() (int32, error) {
  23. if pd.avail() < 4 {
  24. return -1, errors.New("kafka getInt32: not enough data")
  25. }
  26. tmp := int32(binary.BigEndian.Uint32(pd.raw[pd.off:]))
  27. pd.off += 4
  28. return tmp, nil
  29. }
  30. func (pd *packetDecoder) getArrayCount() (int, error) {
  31. if pd.avail() < 4 {
  32. return -1, errors.New("kafka getArrayCount: not enough data")
  33. }
  34. tmp := int(binary.BigEndian.Uint32(pd.raw[pd.off:]))
  35. pd.off += 4
  36. if tmp > pd.avail() || tmp > 2*math.MaxUint16 {
  37. return -1, errors.New("kafka getArrayCount: unreasonably long array")
  38. }
  39. return tmp, nil
  40. }
  41. func (pd *packetDecoder) getError() (kafkaError, error) {
  42. val, err := pd.getInt16()
  43. return kafkaError(val), err
  44. }
  45. func (pd *packetDecoder) getString() (*string, error) {
  46. tmp, err := pd.getInt16()
  47. if err != nil {
  48. return nil, err
  49. }
  50. n := int(tmp)
  51. switch {
  52. case n < -1:
  53. return nil, errors.New("kafka getString: invalid negative length")
  54. case n == -1:
  55. return nil, nil
  56. case n == 0:
  57. return new(string), nil
  58. case n > pd.avail():
  59. return nil, errors.New("kafka getString: not enough data")
  60. default:
  61. tmp := new(string)
  62. *tmp = string(pd.raw[pd.off : pd.off+n])
  63. return tmp, nil
  64. }
  65. }