@@ -18,6 +18,7 @@ use crate::body::DecodedLength;
18
18
use crate :: common:: date;
19
19
use crate :: error:: Parse ;
20
20
use crate :: ext:: HeaderCaseMap ;
21
+ use crate :: ext:: RawResponseHeaders ;
21
22
#[ cfg( feature = "ffi" ) ]
22
23
use crate :: ext:: OriginalHeaderOrder ;
23
24
use crate :: headers;
@@ -1056,19 +1057,32 @@ impl Http1Transaction for Client {
1056
1057
} ;
1057
1058
1058
1059
let mut slice = buf. split_to ( len) ;
1060
+ let raw_headers;
1059
1061
1060
- if ctx
1062
+ let slice = if ctx
1061
1063
. h1_parser_config
1062
1064
. obsolete_multiline_headers_in_responses_are_allowed ( )
1063
1065
{
1066
+ raw_headers = if ctx. record_raw_headers {
1067
+ Some ( RawResponseHeaders :: from ( slice. clone ( ) . freeze ( ) ) )
1068
+ } else {
1069
+ None
1070
+ } ;
1064
1071
for header in & mut headers_indices[ ..headers_len] {
1065
1072
// SAFETY: array is valid up to `headers_len`
1066
1073
let header = unsafe { header. assume_init_mut ( ) } ;
1067
1074
Client :: obs_fold_line ( & mut slice, header) ;
1068
1075
}
1069
- }
1070
-
1071
- let slice = slice. freeze ( ) ;
1076
+ slice. freeze ( )
1077
+ } else {
1078
+ let slice = slice. freeze ( ) ;
1079
+ raw_headers = if ctx. record_raw_headers {
1080
+ Some ( RawResponseHeaders :: from ( slice. clone ( ) ) )
1081
+ } else {
1082
+ None
1083
+ } ;
1084
+ slice
1085
+ } ;
1072
1086
1073
1087
let mut headers = ctx. cached_headers . take ( ) . unwrap_or_default ( ) ;
1074
1088
@@ -1119,6 +1133,14 @@ impl Http1Transaction for Client {
1119
1133
1120
1134
let mut extensions = http:: Extensions :: default ( ) ;
1121
1135
1136
+ if let Some ( raw_request_headers) = ctx. raw_request_headers {
1137
+ extensions. insert ( raw_request_headers. clone ( ) ) ;
1138
+ }
1139
+
1140
+ if let Some ( raw_headers) = raw_headers {
1141
+ extensions. insert ( raw_headers) ;
1142
+ }
1143
+
1122
1144
if let Some ( header_case_map) = header_case_map {
1123
1145
extensions. insert ( header_case_map) ;
1124
1146
}
@@ -1656,6 +1678,8 @@ mod tests {
1656
1678
req_method : & mut method,
1657
1679
h1_parser_config : Default :: default ( ) ,
1658
1680
h1_max_headers : None ,
1681
+ raw_request_headers : None ,
1682
+ record_raw_headers : false ,
1659
1683
preserve_header_case : false ,
1660
1684
#[ cfg( feature = "ffi" ) ]
1661
1685
preserve_header_order : false ,
@@ -1684,6 +1708,8 @@ mod tests {
1684
1708
req_method : & mut Some ( crate :: Method :: GET ) ,
1685
1709
h1_parser_config : Default :: default ( ) ,
1686
1710
h1_max_headers : None ,
1711
+ raw_request_headers : None ,
1712
+ record_raw_headers : false ,
1687
1713
preserve_header_case : false ,
1688
1714
#[ cfg( feature = "ffi" ) ]
1689
1715
preserve_header_order : false ,
@@ -1708,6 +1734,8 @@ mod tests {
1708
1734
req_method : & mut None ,
1709
1735
h1_parser_config : Default :: default ( ) ,
1710
1736
h1_max_headers : None ,
1737
+ raw_request_headers : None ,
1738
+ record_raw_headers : false ,
1711
1739
preserve_header_case : false ,
1712
1740
#[ cfg( feature = "ffi" ) ]
1713
1741
preserve_header_order : false ,
@@ -1729,6 +1757,8 @@ mod tests {
1729
1757
req_method : & mut Some ( crate :: Method :: GET ) ,
1730
1758
h1_parser_config : Default :: default ( ) ,
1731
1759
h1_max_headers : None ,
1760
+ raw_request_headers : None ,
1761
+ record_raw_headers : false ,
1732
1762
preserve_header_case : false ,
1733
1763
#[ cfg( feature = "ffi" ) ]
1734
1764
preserve_header_order : false ,
@@ -1752,6 +1782,8 @@ mod tests {
1752
1782
req_method : & mut Some ( crate :: Method :: GET ) ,
1753
1783
h1_parser_config : Default :: default ( ) ,
1754
1784
h1_max_headers : None ,
1785
+ raw_request_headers : None ,
1786
+ record_raw_headers : false ,
1755
1787
preserve_header_case : false ,
1756
1788
#[ cfg( feature = "ffi" ) ]
1757
1789
preserve_header_order : false ,
@@ -1779,6 +1811,8 @@ mod tests {
1779
1811
req_method : & mut Some ( crate :: Method :: GET ) ,
1780
1812
h1_parser_config,
1781
1813
h1_max_headers : None ,
1814
+ raw_request_headers : None ,
1815
+ record_raw_headers : false ,
1782
1816
preserve_header_case : false ,
1783
1817
#[ cfg( feature = "ffi" ) ]
1784
1818
preserve_header_order : false ,
@@ -1803,6 +1837,8 @@ mod tests {
1803
1837
req_method : & mut Some ( crate :: Method :: GET ) ,
1804
1838
h1_parser_config : Default :: default ( ) ,
1805
1839
h1_max_headers : None ,
1840
+ raw_request_headers : None ,
1841
+ record_raw_headers : false ,
1806
1842
preserve_header_case : false ,
1807
1843
#[ cfg( feature = "ffi" ) ]
1808
1844
preserve_header_order : false ,
@@ -1823,6 +1859,8 @@ mod tests {
1823
1859
req_method : & mut None ,
1824
1860
h1_parser_config : Default :: default ( ) ,
1825
1861
h1_max_headers : None ,
1862
+ raw_request_headers : None ,
1863
+ record_raw_headers : false ,
1826
1864
preserve_header_case : true ,
1827
1865
#[ cfg( feature = "ffi" ) ]
1828
1866
preserve_header_order : false ,
@@ -1862,6 +1900,8 @@ mod tests {
1862
1900
req_method : & mut None ,
1863
1901
h1_parser_config : Default :: default ( ) ,
1864
1902
h1_max_headers : None ,
1903
+ raw_request_headers : None ,
1904
+ record_raw_headers : false ,
1865
1905
preserve_header_case : false ,
1866
1906
#[ cfg( feature = "ffi" ) ]
1867
1907
preserve_header_order : false ,
@@ -1883,6 +1923,8 @@ mod tests {
1883
1923
req_method : & mut None ,
1884
1924
h1_parser_config : Default :: default ( ) ,
1885
1925
h1_max_headers : None ,
1926
+ raw_request_headers : None ,
1927
+ record_raw_headers : false ,
1886
1928
preserve_header_case : false ,
1887
1929
#[ cfg( feature = "ffi" ) ]
1888
1930
preserve_header_order : false ,
@@ -2113,6 +2155,8 @@ mod tests {
2113
2155
req_method: & mut Some ( Method :: GET ) ,
2114
2156
h1_parser_config: Default :: default ( ) ,
2115
2157
h1_max_headers: None ,
2158
+ raw_request_headers: None ,
2159
+ record_raw_headers: false ,
2116
2160
preserve_header_case: false ,
2117
2161
#[ cfg( feature = "ffi" ) ]
2118
2162
preserve_header_order: false ,
@@ -2134,6 +2178,8 @@ mod tests {
2134
2178
req_method : & mut Some ( m) ,
2135
2179
h1_parser_config : Default :: default ( ) ,
2136
2180
h1_max_headers : None ,
2181
+ raw_request_headers : None ,
2182
+ record_raw_headers : false ,
2137
2183
preserve_header_case : false ,
2138
2184
#[ cfg( feature = "ffi" ) ]
2139
2185
preserve_header_order : false ,
@@ -2155,6 +2201,8 @@ mod tests {
2155
2201
req_method : & mut Some ( Method :: GET ) ,
2156
2202
h1_parser_config : Default :: default ( ) ,
2157
2203
h1_max_headers : None ,
2204
+ raw_request_headers : None ,
2205
+ record_raw_headers : false ,
2158
2206
preserve_header_case : false ,
2159
2207
#[ cfg( feature = "ffi" ) ]
2160
2208
preserve_header_order : false ,
@@ -2725,6 +2773,8 @@ mod tests {
2725
2773
req_method : & mut Some ( Method :: GET ) ,
2726
2774
h1_parser_config : Default :: default ( ) ,
2727
2775
h1_max_headers : None ,
2776
+ raw_request_headers : None ,
2777
+ record_raw_headers : false ,
2728
2778
preserve_header_case : false ,
2729
2779
#[ cfg( feature = "ffi" ) ]
2730
2780
preserve_header_order : false ,
@@ -2769,6 +2819,8 @@ mod tests {
2769
2819
req_method : & mut None ,
2770
2820
h1_parser_config : Default :: default ( ) ,
2771
2821
h1_max_headers : max_headers,
2822
+ raw_request_headers : None ,
2823
+ record_raw_headers : false ,
2772
2824
preserve_header_case : false ,
2773
2825
#[ cfg( feature = "ffi" ) ]
2774
2826
preserve_header_order : false ,
@@ -2793,6 +2845,8 @@ mod tests {
2793
2845
req_method : & mut None ,
2794
2846
h1_parser_config : Default :: default ( ) ,
2795
2847
h1_max_headers : max_headers,
2848
+ raw_request_headers : None ,
2849
+ record_raw_headers : false ,
2796
2850
preserve_header_case : false ,
2797
2851
#[ cfg( feature = "ffi" ) ]
2798
2852
preserve_header_order : false ,
0 commit comments