@@ -29,14 +29,32 @@ type HeaderValue struct {
2929
3030type HeaderKey struct {
3131 Kind HeaderKind
32- Value string
32+ Value []byte
33+ }
34+
35+ type HeaderEntry struct {
36+ Key HeaderKey
37+ Value HeaderValue
3338}
3439
3540func NewHeaderKeyString (val string ) (HeaderKey , error ) {
3641 if len (val ) == 0 || len (val ) > 255 {
3742 return HeaderKey {}, errors .New ("value has incorrect size, must be between 1 and 255" )
3843 }
39- return HeaderKey {Kind : String , Value : val }, nil
44+ return HeaderKey {Kind : String , Value : []byte (val )}, nil
45+ }
46+
47+ func NewHeaderKeyRaw (val []byte ) (HeaderKey , error ) {
48+ if len (val ) == 0 || len (val ) > 255 {
49+ return HeaderKey {}, errors .New ("value has incorrect size, must be between 1 and 255" )
50+ }
51+ return HeaderKey {Kind : Raw , Value : val }, nil
52+ }
53+
54+ func NewHeaderKeyInt32 (val int32 ) HeaderKey {
55+ buf := make ([]byte , 4 )
56+ binary .LittleEndian .PutUint32 (buf , uint32 (val ))
57+ return HeaderKey {Kind : Int32 , Value : buf }
4058}
4159
4260type HeaderKind int
@@ -59,34 +77,50 @@ const (
5977 Double HeaderKind = 15
6078)
6179
62- func GetHeadersBytes (headers map [HeaderKey ]HeaderValue ) []byte {
80+ func (k HeaderKind ) ExpectedSize () int {
81+ switch k {
82+ case Bool , Int8 , Uint8 :
83+ return 1
84+ case Int16 , Uint16 :
85+ return 2
86+ case Int32 , Uint32 , Float :
87+ return 4
88+ case Int64 , Uint64 , Double :
89+ return 8
90+ case Int128 , Uint128 :
91+ return 16
92+ default :
93+ return - 1
94+ }
95+ }
96+
97+ func GetHeadersBytes (headers []HeaderEntry ) []byte {
6398 headersLength := 0
64- for key , header := range headers {
65- headersLength += 1 + 4 + len ([] byte ( key . Value )) + 1 + 4 + len (header .Value )
99+ for _ , entry := range headers {
100+ headersLength += 1 + 4 + len (entry . Key . Value ) + 1 + 4 + len (entry . Value .Value )
66101 }
67102 headersBytes := make ([]byte , headersLength )
68103 position := 0
69- for key , value := range headers {
70- headerBytes := getBytesFromHeader (key , value )
104+ for _ , entry := range headers {
105+ headerBytes := getBytesFromHeader (entry . Key , entry . Value )
71106 copy (headersBytes [position :position + len (headerBytes )], headerBytes )
72107 position += len (headerBytes )
73108 }
74109 return headersBytes
75110}
76111
77112func getBytesFromHeader (key HeaderKey , value HeaderValue ) []byte {
78- keyBytes := []byte (key .Value )
79- headerBytesLength := 1 + 4 + len (keyBytes ) + 1 + 4 + len (value .Value )
113+ headerBytesLength := 1 + 4 + len (key .Value ) + 1 + 4 + len (value .Value )
80114 headerBytes := make ([]byte , headerBytesLength )
81115 pos := 0
82116
83117 headerBytes [pos ] = byte (key .Kind )
84118 pos ++
85119
86- binary .LittleEndian .PutUint32 (headerBytes [pos :pos + 4 ], uint32 (len (keyBytes )))
120+ binary .LittleEndian .PutUint32 (headerBytes [pos :pos + 4 ], uint32 (len (key . Value )))
87121 pos += 4
88- copy (headerBytes [pos :pos + len (keyBytes )], keyBytes )
89- pos += len (keyBytes )
122+ copy (headerBytes [pos :pos + len (key . Value )], key . Value )
123+ pos += len (key . Value )
90124
91125 headerBytes [pos ] = byte (value .Kind )
92126 pos ++
@@ -98,8 +132,8 @@ func getBytesFromHeader(key HeaderKey, value HeaderValue) []byte {
98132 return headerBytes
99133}
100134
101- func DeserializeHeaders (userHeadersBytes []byte ) (map [ HeaderKey ] HeaderValue , error ) {
102- headers := make ( map [ HeaderKey ] HeaderValue )
135+ func DeserializeHeaders (userHeadersBytes []byte ) ([] HeaderEntry , error ) {
136+ var headers [] HeaderEntry
103137 position := 0
104138
105139 for position < len (userHeadersBytes ) {
@@ -123,7 +157,12 @@ func DeserializeHeaders(userHeadersBytes []byte) (map[HeaderKey]HeaderValue, err
123157 return nil , errors .New ("invalid header key" )
124158 }
125159
126- keyValue := string (userHeadersBytes [position : position + int (keyLength )])
160+ if expected := keyKind .ExpectedSize (); expected != - 1 && int (keyLength ) != expected {
161+ return nil , errors .New ("invalid header key size for kind" )
162+ }
163+
164+ keyValue := make ([]byte , keyLength )
165+ copy (keyValue , userHeadersBytes [position :position + int (keyLength )])
127166 position += int (keyLength )
128167
129168 valueKind , err := deserializeHeaderKind (userHeadersBytes , position )
@@ -147,13 +186,18 @@ func DeserializeHeaders(userHeadersBytes []byte) (map[HeaderKey]HeaderValue, err
147186 return nil , errors .New ("invalid header value" )
148187 }
149188
150- value := userHeadersBytes [position : position + int (valueLength )]
189+ if expected := valueKind .ExpectedSize (); expected != - 1 && int (valueLength ) != expected {
190+ return nil , errors .New ("invalid header value size for kind" )
191+ }
192+
193+ valueBytes := make ([]byte , valueLength )
194+ copy (valueBytes , userHeadersBytes [position :position + int (valueLength )])
151195 position += int (valueLength )
152196
153- headers [ HeaderKey { Kind : keyKind , Value : keyValue }] = HeaderValue {
154- Kind : valueKind ,
155- Value : value ,
156- }
197+ headers = append ( headers , HeaderEntry {
198+ Key : HeaderKey { Kind : keyKind , Value : keyValue } ,
199+ Value : HeaderValue { Kind : valueKind , Value : valueBytes } ,
200+ })
157201 }
158202
159203 return headers , nil
0 commit comments