@@ -11,35 +11,48 @@ func ReadAddons(data []byte) (*Addons, error) {
1111 reader := bytes .NewReader (data )
1212 var addons Addons
1313 for reader .Len () > 0 {
14- protoHeader , err := reader . ReadByte ( )
14+ tag , err := binary . ReadUvarint ( reader )
1515 if err != nil {
1616 return nil , err
1717 }
18- switch protoHeader {
19- case (1 << 3 ) | 2 :
20- flowLen , err := binary .ReadUvarint (reader )
18+ number , typ := int32 (tag >> 3 ), int8 (tag & 7 )
19+ switch typ {
20+ case 0 : // VARINT
21+ _ , err = binary .ReadUvarint (reader )
2122 if err != nil {
2223 return nil , err
2324 }
24- flowBytes := make ([]byte , flowLen )
25- _ , err = io .ReadFull (reader , flowBytes )
25+ case 5 : // I32
26+ var i32 [4 ]byte
27+ _ , err = io .ReadFull (reader , i32 [:])
2628 if err != nil {
2729 return nil , err
2830 }
29- addons . Flow = string ( flowBytes )
30- case ( 2 << 3 ) | 2 :
31- seedLen , err := binary . ReadUvarint (reader )
31+ case 1 : // I64
32+ var i64 [ 8 ] byte
33+ _ , err = io . ReadFull (reader , i64 [:] )
3234 if err != nil {
3335 return nil , err
3436 }
35- seedBytes := make ([]byte , seedLen )
36- _ , err = io .ReadFull (reader , seedBytes )
37+ case 2 : // LEN
38+ var bytesLen uint64
39+ bytesLen , err = binary .ReadUvarint (reader )
3740 if err != nil {
3841 return nil , err
3942 }
40- addons .Seed = seedBytes
41- default :
42- return nil , fmt .Errorf ("unknown protobuf message header: %v" , protoHeader )
43+ bytesData := make ([]byte , bytesLen )
44+ _ , err = io .ReadFull (reader , bytesData )
45+ if err != nil {
46+ return nil , err
47+ }
48+ switch number {
49+ case 1 :
50+ addons .Flow = string (bytesData )
51+ case 2 :
52+ addons .Seed = bytesData
53+ }
54+ default : // group (3,4) has been deprecated we unneeded support
55+ return nil , fmt .Errorf ("unknown protobuf message tag: %v" , tag )
4356 }
4457 }
4558 return & addons , nil
@@ -48,14 +61,22 @@ func ReadAddons(data []byte) (*Addons, error) {
4861func WriteAddons (addons * Addons ) []byte {
4962 var writer bytes.Buffer
5063 if len (addons .Flow ) > 0 {
51- writer . WriteByte (( 1 << 3 ) | 2 )
52- writer . Write ( binary . AppendUvarint ( nil , uint64 (len (addons .Flow ) )))
64+ WriteUvarint ( & writer , ( 1 << 3 ) | 2 ) // (field << 3) bit-or wire_type encoded as uint32 varint
65+ WriteUvarint ( & writer , uint64 (len (addons .Flow )))
5366 writer .WriteString (addons .Flow )
5467 }
5568 if len (addons .Seed ) > 0 {
56- writer . WriteByte (( 2 << 3 ) | 2 )
57- writer . Write ( binary . AppendUvarint ( nil , uint64 (len (addons .Seed ) )))
69+ WriteUvarint ( & writer , ( 2 << 3 ) | 2 ) // (field << 3) bit-or wire_type encoded as uint32 varint
70+ WriteUvarint ( & writer , uint64 (len (addons .Seed )))
5871 writer .Write (addons .Seed )
5972 }
6073 return writer .Bytes ()
6174}
75+
76+ func WriteUvarint (writer * bytes.Buffer , x uint64 ) {
77+ for x >= 0x80 {
78+ writer .WriteByte (byte (x ) | 0x80 )
79+ x >>= 7
80+ }
81+ writer .WriteByte (byte (x ))
82+ }
0 commit comments