@@ -18,6 +18,7 @@ use crate::body::DecodedLength;
1818use crate :: common:: date;
1919use crate :: error:: Parse ;
2020use crate :: ext:: HeaderCaseMap ;
21+ use crate :: ext:: RawResponseHeaders ;
2122#[ cfg( feature = "ffi" ) ]
2223use crate :: ext:: OriginalHeaderOrder ;
2324use crate :: headers;
@@ -1056,19 +1057,32 @@ impl Http1Transaction for Client {
10561057 } ;
10571058
10581059 let mut slice = buf. split_to ( len) ;
1060+ let raw_headers;
10591061
1060- if ctx
1062+ let slice = if ctx
10611063 . h1_parser_config
10621064 . obsolete_multiline_headers_in_responses_are_allowed ( )
10631065 {
1066+ raw_headers = if ctx. record_raw_headers {
1067+ Some ( RawResponseHeaders :: from ( slice. clone ( ) . freeze ( ) ) )
1068+ } else {
1069+ None
1070+ } ;
10641071 for header in & mut headers_indices[ ..headers_len] {
10651072 // SAFETY: array is valid up to `headers_len`
10661073 let header = unsafe { header. assume_init_mut ( ) } ;
10671074 Client :: obs_fold_line ( & mut slice, header) ;
10681075 }
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+ } ;
10721086
10731087 let mut headers = ctx. cached_headers . take ( ) . unwrap_or_default ( ) ;
10741088
@@ -1119,6 +1133,14 @@ impl Http1Transaction for Client {
11191133
11201134 let mut extensions = http:: Extensions :: default ( ) ;
11211135
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+
11221144 if let Some ( header_case_map) = header_case_map {
11231145 extensions. insert ( header_case_map) ;
11241146 }
@@ -1656,6 +1678,8 @@ mod tests {
16561678 req_method : & mut method,
16571679 h1_parser_config : Default :: default ( ) ,
16581680 h1_max_headers : None ,
1681+ raw_request_headers : None ,
1682+ record_raw_headers : false ,
16591683 preserve_header_case : false ,
16601684 #[ cfg( feature = "ffi" ) ]
16611685 preserve_header_order : false ,
@@ -1684,6 +1708,8 @@ mod tests {
16841708 req_method : & mut Some ( crate :: Method :: GET ) ,
16851709 h1_parser_config : Default :: default ( ) ,
16861710 h1_max_headers : None ,
1711+ raw_request_headers : None ,
1712+ record_raw_headers : false ,
16871713 preserve_header_case : false ,
16881714 #[ cfg( feature = "ffi" ) ]
16891715 preserve_header_order : false ,
@@ -1708,6 +1734,8 @@ mod tests {
17081734 req_method : & mut None ,
17091735 h1_parser_config : Default :: default ( ) ,
17101736 h1_max_headers : None ,
1737+ raw_request_headers : None ,
1738+ record_raw_headers : false ,
17111739 preserve_header_case : false ,
17121740 #[ cfg( feature = "ffi" ) ]
17131741 preserve_header_order : false ,
@@ -1729,6 +1757,8 @@ mod tests {
17291757 req_method : & mut Some ( crate :: Method :: GET ) ,
17301758 h1_parser_config : Default :: default ( ) ,
17311759 h1_max_headers : None ,
1760+ raw_request_headers : None ,
1761+ record_raw_headers : false ,
17321762 preserve_header_case : false ,
17331763 #[ cfg( feature = "ffi" ) ]
17341764 preserve_header_order : false ,
@@ -1752,6 +1782,8 @@ mod tests {
17521782 req_method : & mut Some ( crate :: Method :: GET ) ,
17531783 h1_parser_config : Default :: default ( ) ,
17541784 h1_max_headers : None ,
1785+ raw_request_headers : None ,
1786+ record_raw_headers : false ,
17551787 preserve_header_case : false ,
17561788 #[ cfg( feature = "ffi" ) ]
17571789 preserve_header_order : false ,
@@ -1779,6 +1811,8 @@ mod tests {
17791811 req_method : & mut Some ( crate :: Method :: GET ) ,
17801812 h1_parser_config,
17811813 h1_max_headers : None ,
1814+ raw_request_headers : None ,
1815+ record_raw_headers : false ,
17821816 preserve_header_case : false ,
17831817 #[ cfg( feature = "ffi" ) ]
17841818 preserve_header_order : false ,
@@ -1803,6 +1837,8 @@ mod tests {
18031837 req_method : & mut Some ( crate :: Method :: GET ) ,
18041838 h1_parser_config : Default :: default ( ) ,
18051839 h1_max_headers : None ,
1840+ raw_request_headers : None ,
1841+ record_raw_headers : false ,
18061842 preserve_header_case : false ,
18071843 #[ cfg( feature = "ffi" ) ]
18081844 preserve_header_order : false ,
@@ -1823,6 +1859,8 @@ mod tests {
18231859 req_method : & mut None ,
18241860 h1_parser_config : Default :: default ( ) ,
18251861 h1_max_headers : None ,
1862+ raw_request_headers : None ,
1863+ record_raw_headers : false ,
18261864 preserve_header_case : true ,
18271865 #[ cfg( feature = "ffi" ) ]
18281866 preserve_header_order : false ,
@@ -1862,6 +1900,8 @@ mod tests {
18621900 req_method : & mut None ,
18631901 h1_parser_config : Default :: default ( ) ,
18641902 h1_max_headers : None ,
1903+ raw_request_headers : None ,
1904+ record_raw_headers : false ,
18651905 preserve_header_case : false ,
18661906 #[ cfg( feature = "ffi" ) ]
18671907 preserve_header_order : false ,
@@ -1883,6 +1923,8 @@ mod tests {
18831923 req_method : & mut None ,
18841924 h1_parser_config : Default :: default ( ) ,
18851925 h1_max_headers : None ,
1926+ raw_request_headers : None ,
1927+ record_raw_headers : false ,
18861928 preserve_header_case : false ,
18871929 #[ cfg( feature = "ffi" ) ]
18881930 preserve_header_order : false ,
@@ -2113,6 +2155,8 @@ mod tests {
21132155 req_method: & mut Some ( Method :: GET ) ,
21142156 h1_parser_config: Default :: default ( ) ,
21152157 h1_max_headers: None ,
2158+ raw_request_headers: None ,
2159+ record_raw_headers: false ,
21162160 preserve_header_case: false ,
21172161 #[ cfg( feature = "ffi" ) ]
21182162 preserve_header_order: false ,
@@ -2134,6 +2178,8 @@ mod tests {
21342178 req_method : & mut Some ( m) ,
21352179 h1_parser_config : Default :: default ( ) ,
21362180 h1_max_headers : None ,
2181+ raw_request_headers : None ,
2182+ record_raw_headers : false ,
21372183 preserve_header_case : false ,
21382184 #[ cfg( feature = "ffi" ) ]
21392185 preserve_header_order : false ,
@@ -2155,6 +2201,8 @@ mod tests {
21552201 req_method : & mut Some ( Method :: GET ) ,
21562202 h1_parser_config : Default :: default ( ) ,
21572203 h1_max_headers : None ,
2204+ raw_request_headers : None ,
2205+ record_raw_headers : false ,
21582206 preserve_header_case : false ,
21592207 #[ cfg( feature = "ffi" ) ]
21602208 preserve_header_order : false ,
@@ -2725,6 +2773,8 @@ mod tests {
27252773 req_method : & mut Some ( Method :: GET ) ,
27262774 h1_parser_config : Default :: default ( ) ,
27272775 h1_max_headers : None ,
2776+ raw_request_headers : None ,
2777+ record_raw_headers : false ,
27282778 preserve_header_case : false ,
27292779 #[ cfg( feature = "ffi" ) ]
27302780 preserve_header_order : false ,
@@ -2769,6 +2819,8 @@ mod tests {
27692819 req_method : & mut None ,
27702820 h1_parser_config : Default :: default ( ) ,
27712821 h1_max_headers : max_headers,
2822+ raw_request_headers : None ,
2823+ record_raw_headers : false ,
27722824 preserve_header_case : false ,
27732825 #[ cfg( feature = "ffi" ) ]
27742826 preserve_header_order : false ,
@@ -2793,6 +2845,8 @@ mod tests {
27932845 req_method : & mut None ,
27942846 h1_parser_config : Default :: default ( ) ,
27952847 h1_max_headers : max_headers,
2848+ raw_request_headers : None ,
2849+ record_raw_headers : false ,
27962850 preserve_header_case : false ,
27972851 #[ cfg( feature = "ffi" ) ]
27982852 preserve_header_order : false ,
0 commit comments