@@ -17,6 +17,8 @@ use crate::body::DecodedLength;
17
17
use crate :: common:: date;
18
18
use crate :: error:: Parse ;
19
19
use crate :: ext:: HeaderCaseMap ;
20
+ #[ cfg( feature = "ffi" ) ]
21
+ use crate :: ext:: OriginalHeaderOrder ;
20
22
use crate :: headers;
21
23
use crate :: proto:: h1:: {
22
24
Encode , Encoder , Http1Transaction , ParseContext , ParseResult , ParsedMessage ,
@@ -214,6 +216,13 @@ impl Http1Transaction for Server {
214
216
None
215
217
} ;
216
218
219
+ #[ cfg( feature = "ffi" ) ]
220
+ let mut header_order = if ctx. preserve_header_order {
221
+ Some ( OriginalHeaderOrder :: default ( ) )
222
+ } else {
223
+ None
224
+ } ;
225
+
217
226
let mut headers = ctx. cached_headers . take ( ) . unwrap_or_else ( HeaderMap :: new) ;
218
227
219
228
headers. reserve ( headers_len) ;
@@ -290,6 +299,11 @@ impl Http1Transaction for Server {
290
299
header_case_map. append ( & name, slice. slice ( header. name . 0 ..header. name . 1 ) ) ;
291
300
}
292
301
302
+ #[ cfg( feature = "ffi" ) ]
303
+ if let Some ( ref mut header_order) = header_order {
304
+ header_order. append ( & name) ;
305
+ }
306
+
293
307
headers. append ( name, value) ;
294
308
}
295
309
@@ -304,6 +318,11 @@ impl Http1Transaction for Server {
304
318
extensions. insert ( header_case_map) ;
305
319
}
306
320
321
+ #[ cfg( feature = "ffi" ) ]
322
+ if let Some ( header_order) = header_order {
323
+ extensions. insert ( header_order) ;
324
+ }
325
+
307
326
* ctx. req_method = Some ( subject. 0 . clone ( ) ) ;
308
327
309
328
Ok ( Some ( ParsedMessage {
@@ -957,7 +976,10 @@ impl Http1Transaction for Client {
957
976
958
977
let mut slice = buf. split_to ( len) ;
959
978
960
- if ctx. h1_parser_config . obsolete_multiline_headers_in_responses_are_allowed ( ) {
979
+ if ctx
980
+ . h1_parser_config
981
+ . obsolete_multiline_headers_in_responses_are_allowed ( )
982
+ {
961
983
for header in & headers_indices[ ..headers_len] {
962
984
// SAFETY: array is valid up to `headers_len`
963
985
let header = unsafe { & * header. as_ptr ( ) } ;
@@ -981,6 +1003,13 @@ impl Http1Transaction for Client {
981
1003
None
982
1004
} ;
983
1005
1006
+ #[ cfg( feature = "ffi" ) ]
1007
+ let mut header_order = if ctx. preserve_header_order {
1008
+ Some ( OriginalHeaderOrder :: default ( ) )
1009
+ } else {
1010
+ None
1011
+ } ;
1012
+
984
1013
headers. reserve ( headers_len) ;
985
1014
for header in & headers_indices[ ..headers_len] {
986
1015
// SAFETY: array is valid up to `headers_len`
@@ -1003,6 +1032,11 @@ impl Http1Transaction for Client {
1003
1032
header_case_map. append ( & name, slice. slice ( header. name . 0 ..header. name . 1 ) ) ;
1004
1033
}
1005
1034
1035
+ #[ cfg( feature = "ffi" ) ]
1036
+ if let Some ( ref mut header_order) = header_order {
1037
+ header_order. append ( & name) ;
1038
+ }
1039
+
1006
1040
headers. append ( name, value) ;
1007
1041
}
1008
1042
@@ -1012,6 +1046,11 @@ impl Http1Transaction for Client {
1012
1046
extensions. insert ( header_case_map) ;
1013
1047
}
1014
1048
1049
+ #[ cfg( feature = "ffi" ) ]
1050
+ if let Some ( header_order) = header_order {
1051
+ extensions. insert ( header_order) ;
1052
+ }
1053
+
1015
1054
#[ cfg( feature = "ffi" ) ]
1016
1055
if let Some ( reason) = reason {
1017
1056
extensions. insert ( crate :: ffi:: ReasonPhrase ( reason) ) ;
@@ -1481,6 +1520,8 @@ mod tests {
1481
1520
#[ cfg( feature = "runtime" ) ]
1482
1521
h1_header_read_timeout_running : & mut false ,
1483
1522
preserve_header_case : false ,
1523
+ #[ cfg( feature = "ffi" ) ]
1524
+ preserve_header_order : false ,
1484
1525
h09_responses : false ,
1485
1526
#[ cfg( feature = "ffi" ) ]
1486
1527
on_informational : & mut None ,
@@ -1514,6 +1555,8 @@ mod tests {
1514
1555
#[ cfg( feature = "runtime" ) ]
1515
1556
h1_header_read_timeout_running : & mut false ,
1516
1557
preserve_header_case : false ,
1558
+ #[ cfg( feature = "ffi" ) ]
1559
+ preserve_header_order : false ,
1517
1560
h09_responses : false ,
1518
1561
#[ cfg( feature = "ffi" ) ]
1519
1562
on_informational : & mut None ,
@@ -1542,6 +1585,8 @@ mod tests {
1542
1585
#[ cfg( feature = "runtime" ) ]
1543
1586
h1_header_read_timeout_running : & mut false ,
1544
1587
preserve_header_case : false ,
1588
+ #[ cfg( feature = "ffi" ) ]
1589
+ preserve_header_order : false ,
1545
1590
h09_responses : false ,
1546
1591
#[ cfg( feature = "ffi" ) ]
1547
1592
on_informational : & mut None ,
@@ -1568,6 +1613,8 @@ mod tests {
1568
1613
#[ cfg( feature = "runtime" ) ]
1569
1614
h1_header_read_timeout_running : & mut false ,
1570
1615
preserve_header_case : false ,
1616
+ #[ cfg( feature = "ffi" ) ]
1617
+ preserve_header_order : false ,
1571
1618
h09_responses : true ,
1572
1619
#[ cfg( feature = "ffi" ) ]
1573
1620
on_informational : & mut None ,
@@ -1596,6 +1643,8 @@ mod tests {
1596
1643
#[ cfg( feature = "runtime" ) ]
1597
1644
h1_header_read_timeout_running : & mut false ,
1598
1645
preserve_header_case : false ,
1646
+ #[ cfg( feature = "ffi" ) ]
1647
+ preserve_header_order : false ,
1599
1648
h09_responses : false ,
1600
1649
#[ cfg( feature = "ffi" ) ]
1601
1650
on_informational : & mut None ,
@@ -1628,6 +1677,8 @@ mod tests {
1628
1677
#[ cfg( feature = "runtime" ) ]
1629
1678
h1_header_read_timeout_running : & mut false ,
1630
1679
preserve_header_case : false ,
1680
+ #[ cfg( feature = "ffi" ) ]
1681
+ preserve_header_order : false ,
1631
1682
h09_responses : false ,
1632
1683
#[ cfg( feature = "ffi" ) ]
1633
1684
on_informational : & mut None ,
@@ -1657,6 +1708,8 @@ mod tests {
1657
1708
#[ cfg( feature = "runtime" ) ]
1658
1709
h1_header_read_timeout_running : & mut false ,
1659
1710
preserve_header_case : false ,
1711
+ #[ cfg( feature = "ffi" ) ]
1712
+ preserve_header_order : false ,
1660
1713
h09_responses : false ,
1661
1714
#[ cfg( feature = "ffi" ) ]
1662
1715
on_informational : & mut None ,
@@ -1681,6 +1734,8 @@ mod tests {
1681
1734
#[ cfg( feature = "runtime" ) ]
1682
1735
h1_header_read_timeout_running : & mut false ,
1683
1736
preserve_header_case : true ,
1737
+ #[ cfg( feature = "ffi" ) ]
1738
+ preserve_header_order : false ,
1684
1739
h09_responses : false ,
1685
1740
#[ cfg( feature = "ffi" ) ]
1686
1741
on_informational : & mut None ,
@@ -1726,6 +1781,8 @@ mod tests {
1726
1781
#[ cfg( feature = "runtime" ) ]
1727
1782
h1_header_read_timeout_running : & mut false ,
1728
1783
preserve_header_case : false ,
1784
+ #[ cfg( feature = "ffi" ) ]
1785
+ preserve_header_order : false ,
1729
1786
h09_responses : false ,
1730
1787
#[ cfg( feature = "ffi" ) ]
1731
1788
on_informational : & mut None ,
@@ -1752,6 +1809,8 @@ mod tests {
1752
1809
#[ cfg( feature = "runtime" ) ]
1753
1810
h1_header_read_timeout_running : & mut false ,
1754
1811
preserve_header_case : false ,
1812
+ #[ cfg( feature = "ffi" ) ]
1813
+ preserve_header_order : false ,
1755
1814
h09_responses : false ,
1756
1815
#[ cfg( feature = "ffi" ) ]
1757
1816
on_informational : & mut None ,
@@ -1987,6 +2046,8 @@ mod tests {
1987
2046
#[ cfg( feature = "runtime" ) ]
1988
2047
h1_header_read_timeout_running: & mut false ,
1989
2048
preserve_header_case: false ,
2049
+ #[ cfg( feature = "ffi" ) ]
2050
+ preserve_header_order: false ,
1990
2051
h09_responses: false ,
1991
2052
#[ cfg( feature = "ffi" ) ]
1992
2053
on_informational: & mut None ,
@@ -2013,6 +2074,8 @@ mod tests {
2013
2074
#[ cfg( feature = "runtime" ) ]
2014
2075
h1_header_read_timeout_running : & mut false ,
2015
2076
preserve_header_case : false ,
2077
+ #[ cfg( feature = "ffi" ) ]
2078
+ preserve_header_order : false ,
2016
2079
h09_responses : false ,
2017
2080
#[ cfg( feature = "ffi" ) ]
2018
2081
on_informational : & mut None ,
@@ -2039,6 +2102,8 @@ mod tests {
2039
2102
#[ cfg( feature = "runtime" ) ]
2040
2103
h1_header_read_timeout_running : & mut false ,
2041
2104
preserve_header_case : false ,
2105
+ #[ cfg( feature = "ffi" ) ]
2106
+ preserve_header_order : false ,
2042
2107
h09_responses : false ,
2043
2108
#[ cfg( feature = "ffi" ) ]
2044
2109
on_informational : & mut None ,
@@ -2542,6 +2607,8 @@ mod tests {
2542
2607
#[ cfg( feature = "runtime" ) ]
2543
2608
h1_header_read_timeout_running : & mut false ,
2544
2609
preserve_header_case : false ,
2610
+ #[ cfg( feature = "ffi" ) ]
2611
+ preserve_header_order : false ,
2545
2612
h09_responses : false ,
2546
2613
#[ cfg( feature = "ffi" ) ]
2547
2614
on_informational : & mut None ,
@@ -2632,6 +2699,8 @@ mod tests {
2632
2699
#[ cfg( feature = "runtime" ) ]
2633
2700
h1_header_read_timeout_running : & mut false ,
2634
2701
preserve_header_case : false ,
2702
+ #[ cfg( feature = "ffi" ) ]
2703
+ preserve_header_order : false ,
2635
2704
h09_responses : false ,
2636
2705
#[ cfg( feature = "ffi" ) ]
2637
2706
on_informational : & mut None ,
@@ -2678,6 +2747,8 @@ mod tests {
2678
2747
#[ cfg( feature = "runtime" ) ]
2679
2748
h1_header_read_timeout_running : & mut false ,
2680
2749
preserve_header_case : false ,
2750
+ #[ cfg( feature = "ffi" ) ]
2751
+ preserve_header_order : false ,
2681
2752
h09_responses : false ,
2682
2753
#[ cfg( feature = "ffi" ) ]
2683
2754
on_informational : & mut None ,