blob: da199a70a0e5fe200603b559348fec15d2e1ac63 [file] [log] [blame]
William Kurkianea869482019-04-09 15:16:11 -04001package sarama
2
3import "encoding/binary"
4
5// LengthField implements the PushEncoder and PushDecoder interfaces for calculating 4-byte lengths.
6type lengthField struct {
7 startOffset int
8 length int32
9}
10
11func (l *lengthField) decode(pd packetDecoder) error {
12 var err error
13 l.length, err = pd.getInt32()
14 if err != nil {
15 return err
16 }
17 if l.length > int32(pd.remaining()) {
18 return ErrInsufficientData
19 }
20 return nil
21}
22
23func (l *lengthField) saveOffset(in int) {
24 l.startOffset = in
25}
26
27func (l *lengthField) reserveLength() int {
28 return 4
29}
30
31func (l *lengthField) run(curOffset int, buf []byte) error {
32 binary.BigEndian.PutUint32(buf[l.startOffset:], uint32(curOffset-l.startOffset-4))
33 return nil
34}
35
36func (l *lengthField) check(curOffset int, buf []byte) error {
37 if int32(curOffset-l.startOffset-4) != l.length {
38 return PacketDecodingError{"length field invalid"}
39 }
40
41 return nil
42}
43
44type varintLengthField struct {
45 startOffset int
46 length int64
47}
48
49func (l *varintLengthField) decode(pd packetDecoder) error {
50 var err error
51 l.length, err = pd.getVarint()
52 return err
53}
54
55func (l *varintLengthField) saveOffset(in int) {
56 l.startOffset = in
57}
58
59func (l *varintLengthField) adjustLength(currOffset int) int {
60 oldFieldSize := l.reserveLength()
61 l.length = int64(currOffset - l.startOffset - oldFieldSize)
62
63 return l.reserveLength() - oldFieldSize
64}
65
66func (l *varintLengthField) reserveLength() int {
67 var tmp [binary.MaxVarintLen64]byte
68 return binary.PutVarint(tmp[:], l.length)
69}
70
71func (l *varintLengthField) run(curOffset int, buf []byte) error {
72 binary.PutVarint(buf[l.startOffset:], l.length)
73 return nil
74}
75
76func (l *varintLengthField) check(curOffset int, buf []byte) error {
77 if int64(curOffset-l.startOffset-l.reserveLength()) != l.length {
78 return PacketDecodingError{"length field invalid"}
79 }
80
81 return nil
82}