realDecoder.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package kafka
  2. import (
  3. "encoding/binary"
  4. "math"
  5. )
  6. type realDecoder struct {
  7. raw []byte
  8. off int
  9. }
  10. func (rd *realDecoder) avail() int {
  11. return len(rd.raw) - rd.off
  12. }
  13. func (rd *realDecoder) getInt16() (int16, error) {
  14. if rd.avail() < 2 {
  15. return -1, DecodingError{}
  16. }
  17. tmp := int16(binary.BigEndian.Uint16(rd.raw[rd.off:]))
  18. rd.off += 2
  19. return tmp, nil
  20. }
  21. func (rd *realDecoder) getInt32() (int32, error) {
  22. if rd.avail() < 4 {
  23. return -1, DecodingError{}
  24. }
  25. tmp := int32(binary.BigEndian.Uint32(rd.raw[rd.off:]))
  26. rd.off += 4
  27. return tmp, nil
  28. }
  29. func (rd *realDecoder) getError() (KError, error) {
  30. val, err := rd.getInt16()
  31. return KError(val), err
  32. }
  33. func (rd *realDecoder) getString() (*string, error) {
  34. tmp, err := rd.getInt16()
  35. if err != nil {
  36. return nil, err
  37. }
  38. n := int(tmp)
  39. switch {
  40. case n < -1:
  41. return nil, DecodingError{}
  42. case n == -1:
  43. return nil, nil
  44. case n == 0:
  45. return new(string), nil
  46. case n > rd.avail():
  47. return nil, DecodingError{}
  48. default:
  49. tmp := new(string)
  50. *tmp = string(rd.raw[rd.off : rd.off+n])
  51. return tmp, nil
  52. }
  53. }
  54. func (rd *realDecoder) getBytes() (*[]byte, error) {
  55. tmp, err := rd.getInt32()
  56. if err != nil {
  57. return nil, err
  58. }
  59. n := int(tmp)
  60. switch {
  61. case n < -1:
  62. return nil, DecodingError{}
  63. case n == -1:
  64. return nil, nil
  65. case n == 0:
  66. tmp := make([]byte, 0)
  67. return &tmp, nil
  68. case n > rd.avail():
  69. return nil, DecodingError{}
  70. default:
  71. tmp := rd.raw[rd.off : rd.off+n]
  72. return &tmp, nil
  73. }
  74. }
  75. func (rd *realDecoder) getArrayCount() (int, error) {
  76. if rd.avail() < 4 {
  77. return -1, DecodingError{}
  78. }
  79. tmp := int(binary.BigEndian.Uint32(rd.raw[rd.off:]))
  80. rd.off += 4
  81. if tmp > rd.avail() || tmp > 2*math.MaxUint16 {
  82. return -1, DecodingError{}
  83. }
  84. return tmp, nil
  85. }