length_field.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package sarama
  2. import "encoding/binary"
  3. // LengthField implements the PushEncoder and PushDecoder interfaces for calculating 4-byte lengths.
  4. type lengthField struct {
  5. startOffset int
  6. }
  7. func (l *lengthField) saveOffset(in int) {
  8. l.startOffset = in
  9. }
  10. func (l *lengthField) reserveLength() int {
  11. return 4
  12. }
  13. func (l *lengthField) run(curOffset int, buf []byte) error {
  14. binary.BigEndian.PutUint32(buf[l.startOffset:], uint32(curOffset-l.startOffset-4))
  15. return nil
  16. }
  17. func (l *lengthField) check(curOffset int, buf []byte) error {
  18. if uint32(curOffset-l.startOffset-4) != binary.BigEndian.Uint32(buf[l.startOffset:]) {
  19. return PacketDecodingError{"length field invalid"}
  20. }
  21. return nil
  22. }
  23. type varintLengthField struct {
  24. startOffset int
  25. length int64
  26. }
  27. func newVarintLengthField(pd packetDecoder) (*varintLengthField, error) {
  28. n, err := pd.getVarint()
  29. if err != nil {
  30. return nil, err
  31. }
  32. return &varintLengthField{length: n}, nil
  33. }
  34. func (l *varintLengthField) saveOffset(in int) {
  35. l.startOffset = in
  36. }
  37. func (l *varintLengthField) reserveLength() int {
  38. return 0
  39. }
  40. func (l *varintLengthField) check(curOffset int, buf []byte) error {
  41. if int64(curOffset-l.startOffset) != l.length {
  42. return PacketDecodingError{"length field invalid"}
  43. }
  44. return nil
  45. }