@@ -1165,10 +1165,10 @@ mod utils {
1165
1165
size += name. len ( ) + value. len ( ) + 10 ;
1166
1166
}
1167
1167
let mut bytes: Bytes = Vec :: with_capacity ( size) ;
1168
- bytes. extend_from_slice ( & map. len ( ) . to_le_bytes ( ) ) ;
1168
+ bytes. extend_from_slice ( & ( map. len ( ) as u32 ) . to_le_bytes ( ) ) ;
1169
1169
for ( name, value) in & map {
1170
- bytes. extend_from_slice ( & name. len ( ) . to_le_bytes ( ) ) ;
1171
- bytes. extend_from_slice ( & value. len ( ) . to_le_bytes ( ) ) ;
1170
+ bytes. extend_from_slice ( & ( name. len ( ) as u32 ) . to_le_bytes ( ) ) ;
1171
+ bytes. extend_from_slice ( & ( value. len ( ) as u32 ) . to_le_bytes ( ) ) ;
1172
1172
}
1173
1173
for ( name, value) in & map {
1174
1174
bytes. extend_from_slice ( name. as_bytes ( ) ) ;
@@ -1185,10 +1185,10 @@ mod utils {
1185
1185
size += name. len ( ) + value. len ( ) + 10 ;
1186
1186
}
1187
1187
let mut bytes: Bytes = Vec :: with_capacity ( size) ;
1188
- bytes. extend_from_slice ( & map. len ( ) . to_le_bytes ( ) ) ;
1188
+ bytes. extend_from_slice ( & ( map. len ( ) as u32 ) . to_le_bytes ( ) ) ;
1189
1189
for ( name, value) in & map {
1190
- bytes. extend_from_slice ( & name. len ( ) . to_le_bytes ( ) ) ;
1191
- bytes. extend_from_slice ( & value. len ( ) . to_le_bytes ( ) ) ;
1190
+ bytes. extend_from_slice ( & ( name. len ( ) as u32 ) . to_le_bytes ( ) ) ;
1191
+ bytes. extend_from_slice ( & ( value. len ( ) as u32 ) . to_le_bytes ( ) ) ;
1192
1192
}
1193
1193
for ( name, value) in & map {
1194
1194
bytes. extend_from_slice ( name. as_bytes ( ) ) ;
@@ -1243,4 +1243,118 @@ mod utils {
1243
1243
}
1244
1244
map
1245
1245
}
1246
+
1247
+ #[ cfg( test) ]
1248
+ mod tests {
1249
+ use super :: * ;
1250
+
1251
+ #[ cfg( nightly) ]
1252
+ use test:: Bencher ;
1253
+
1254
+ static MAP : & [ ( & str , & str ) ] = & [
1255
+ ( ":method" , "GET" ) ,
1256
+ ( ":path" , "/bytes/1" ) ,
1257
+ ( ":authority" , "httpbin.org" ) ,
1258
+ ( "Powered-By" , "proxy-wasm" ) ,
1259
+ ] ;
1260
+
1261
+ #[ rustfmt:: skip]
1262
+ static SERIALIZED_MAP : & [ u8 ] = & [
1263
+ // num entries
1264
+ 4 , 0 , 0 , 0 ,
1265
+ // len (":method", "GET")
1266
+ 7 , 0 , 0 , 0 , 3 , 0 , 0 , 0 ,
1267
+ // len (":path", "/bytes/1")
1268
+ 5 , 0 , 0 , 0 , 8 , 0 , 0 , 0 ,
1269
+ // len (":authority", "httpbin.org")
1270
+ 10 , 0 , 0 , 0 , 11 , 0 , 0 , 0 ,
1271
+ // len ("Powered-By", "proxy-wasm")
1272
+ 10 , 0 , 0 , 0 , 10 , 0 , 0 , 0 ,
1273
+ // ":method"
1274
+ 58 , 109 , 101 , 116 , 104 , 111 , 100 , 0 ,
1275
+ // "GET"
1276
+ 71 , 69 , 84 , 0 ,
1277
+ // ":path"
1278
+ 58 , 112 , 97 , 116 , 104 , 0 ,
1279
+ // "/bytes/1"
1280
+ 47 , 98 , 121 , 116 , 101 , 115 , 47 , 49 , 0 ,
1281
+ // ":authority"
1282
+ 58 , 97 , 117 , 116 , 104 , 111 , 114 , 105 , 116 , 121 , 0 ,
1283
+ // "httpbin.org"
1284
+ 104 , 116 , 116 , 112 , 98 , 105 , 110 , 46 , 111 , 114 , 103 , 0 ,
1285
+ // "Powered-By"
1286
+ 80 , 111 , 119 , 101 , 114 , 101 , 100 , 45 , 66 , 121 , 0 ,
1287
+ // "proxy-wasm"
1288
+ 112 , 114 , 111 , 120 , 121 , 45 , 119 , 97 , 115 , 109 , 0 ,
1289
+ ] ;
1290
+
1291
+ #[ test]
1292
+ fn test_serialize_map ( ) {
1293
+ let serialized_map = serialize_map ( MAP . to_vec ( ) ) ;
1294
+ assert_eq ! ( serialized_map, SERIALIZED_MAP ) ;
1295
+ }
1296
+
1297
+ #[ test]
1298
+ fn test_serialize_map_bytes ( ) {
1299
+ let map: Vec < ( & str , & [ u8 ] ) > = MAP . iter ( ) . map ( |x| ( x. 0 , x. 1 . as_bytes ( ) ) ) . collect ( ) ;
1300
+ let serialized_map = serialize_map_bytes ( map) ;
1301
+ assert_eq ! ( serialized_map, SERIALIZED_MAP ) ;
1302
+ }
1303
+
1304
+ #[ test]
1305
+ fn test_deserialize_map ( ) {
1306
+ let map = deserialize_map ( SERIALIZED_MAP ) ;
1307
+ assert_eq ! ( map. len( ) , MAP . len( ) ) ;
1308
+ for ( got, expected) in map. into_iter ( ) . zip ( MAP ) {
1309
+ assert_eq ! ( got. 0 , expected. 0 ) ;
1310
+ assert_eq ! ( got. 1 , expected. 1 ) ;
1311
+ }
1312
+ }
1313
+
1314
+ #[ test]
1315
+ fn test_deserialize_map_bytes ( ) {
1316
+ let map = deserialize_map_bytes ( SERIALIZED_MAP ) ;
1317
+ assert_eq ! ( map. len( ) , MAP . len( ) ) ;
1318
+ for ( got, expected) in map. into_iter ( ) . zip ( MAP ) {
1319
+ assert_eq ! ( got. 0 , expected. 0 ) ;
1320
+ assert_eq ! ( got. 1 , expected. 1 . as_bytes( ) ) ;
1321
+ }
1322
+ }
1323
+
1324
+ #[ cfg( nightly) ]
1325
+ #[ bench]
1326
+ fn bench_serialize_map ( b : & mut Bencher ) {
1327
+ let map = MAP . to_vec ( ) ;
1328
+ b. iter ( || {
1329
+ serialize_map ( test:: black_box ( map. clone ( ) ) ) ;
1330
+ } ) ;
1331
+ }
1332
+
1333
+ #[ cfg( nightly) ]
1334
+ #[ bench]
1335
+ fn bench_serialize_map_bytes ( b : & mut Bencher ) {
1336
+ let map: Vec < ( & str , & [ u8 ] ) > = MAP . iter ( ) . map ( |x| ( x. 0 , x. 1 . as_bytes ( ) ) ) . collect ( ) ;
1337
+ b. iter ( || {
1338
+ serialize_map_bytes ( test:: black_box ( map. clone ( ) ) ) ;
1339
+ } ) ;
1340
+ }
1341
+
1342
+ #[ cfg( nightly) ]
1343
+ #[ bench]
1344
+ fn bench_deserialize_map ( b : & mut Bencher ) {
1345
+ let serialized_map = SERIALIZED_MAP . to_vec ( ) ;
1346
+ b. iter ( || {
1347
+ deserialize_map ( test:: black_box ( & serialized_map) ) ;
1348
+ } ) ;
1349
+ }
1350
+
1351
+ #[ cfg( nightly) ]
1352
+ #[ bench]
1353
+ fn bench_deserialize_map_bytes ( b : & mut Bencher ) {
1354
+ let serialized_map = SERIALIZED_MAP . to_vec ( ) ;
1355
+ b. iter ( || {
1356
+ deserialize_map_bytes ( test:: black_box ( & serialized_map) ) ;
1357
+ } ) ;
1358
+ }
1359
+ }
1246
1360
}
0 commit comments