@@ -683,8 +683,8 @@ impl Http1Transaction for Client {
683683 ) ;
684684 let mut res = httparse:: Response :: new ( & mut headers) ;
685685 let bytes = buf. as_ref ( ) ;
686- match res. parse ( bytes) ? {
687- httparse:: Status :: Complete ( len) => {
686+ match res. parse ( bytes) {
687+ Ok ( httparse:: Status :: Complete ( len) ) => {
688688 trace ! ( "Response.parse Complete({})" , len) ;
689689 let status = StatusCode :: from_u16 ( res. code . unwrap ( ) ) ?;
690690
@@ -710,7 +710,18 @@ impl Http1Transaction for Client {
710710 let headers_len = res. headers . len ( ) ;
711711 ( len, status, reason, version, headers_len)
712712 }
713- httparse:: Status :: Partial => return Ok ( None ) ,
713+ Ok ( httparse:: Status :: Partial ) => return Ok ( None ) ,
714+ Err ( httparse:: Error :: Version ) if ctx. h09_responses => {
715+ trace ! ( "Response.parse accepted HTTP/0.9 response" ) ;
716+
717+ #[ cfg( not( feature = "ffi" ) ) ]
718+ let reason = ( ) ;
719+ #[ cfg( feature = "ffi" ) ]
720+ let reason = None ;
721+
722+ ( 0 , StatusCode :: OK , reason, Version :: HTTP_09 , 0 )
723+ }
724+ Err ( e) => return Err ( e. into ( ) ) ,
714725 }
715726 } ;
716727
@@ -1222,6 +1233,7 @@ mod tests {
12221233 req_method : & mut method,
12231234 #[ cfg( feature = "ffi" ) ]
12241235 preserve_header_case : false ,
1236+ h09_responses : false ,
12251237 } ,
12261238 )
12271239 . unwrap ( )
@@ -1244,6 +1256,7 @@ mod tests {
12441256 req_method : & mut Some ( crate :: Method :: GET ) ,
12451257 #[ cfg( feature = "ffi" ) ]
12461258 preserve_header_case : false ,
1259+ h09_responses : false ,
12471260 } ;
12481261 let msg = Client :: parse ( & mut raw, ctx) . unwrap ( ) . unwrap ( ) ;
12491262 assert_eq ! ( raw. len( ) , 0 ) ;
@@ -1261,10 +1274,46 @@ mod tests {
12611274 req_method : & mut None ,
12621275 #[ cfg( feature = "ffi" ) ]
12631276 preserve_header_case : false ,
1277+ h09_responses : false ,
12641278 } ;
12651279 Server :: parse ( & mut raw, ctx) . unwrap_err ( ) ;
12661280 }
12671281
1282+ const H09_RESPONSE : & ' static str = "Baguettes are super delicious, don't you agree?" ;
1283+
1284+ #[ test]
1285+ fn test_parse_response_h09_allowed ( ) {
1286+ let _ = pretty_env_logger:: try_init ( ) ;
1287+ let mut raw = BytesMut :: from ( H09_RESPONSE ) ;
1288+ let ctx = ParseContext {
1289+ cached_headers : & mut None ,
1290+ req_method : & mut Some ( crate :: Method :: GET ) ,
1291+ #[ cfg( feature = "ffi" ) ]
1292+ preserve_header_case : false ,
1293+ h09_responses : true ,
1294+ } ;
1295+ let msg = Client :: parse ( & mut raw, ctx) . unwrap ( ) . unwrap ( ) ;
1296+ assert_eq ! ( raw, H09_RESPONSE ) ;
1297+ assert_eq ! ( msg. head. subject, crate :: StatusCode :: OK ) ;
1298+ assert_eq ! ( msg. head. version, crate :: Version :: HTTP_09 ) ;
1299+ assert_eq ! ( msg. head. headers. len( ) , 0 ) ;
1300+ }
1301+
1302+ #[ test]
1303+ fn test_parse_response_h09_rejected ( ) {
1304+ let _ = pretty_env_logger:: try_init ( ) ;
1305+ let mut raw = BytesMut :: from ( H09_RESPONSE ) ;
1306+ let ctx = ParseContext {
1307+ cached_headers : & mut None ,
1308+ req_method : & mut Some ( crate :: Method :: GET ) ,
1309+ #[ cfg( feature = "ffi" ) ]
1310+ preserve_header_case : false ,
1311+ h09_responses : false ,
1312+ } ;
1313+ Client :: parse ( & mut raw, ctx) . unwrap_err ( ) ;
1314+ assert_eq ! ( raw, H09_RESPONSE ) ;
1315+ }
1316+
12681317 #[ test]
12691318 fn test_decoder_request ( ) {
12701319 fn parse ( s : & str ) -> ParsedMessage < RequestLine > {
@@ -1276,6 +1325,7 @@ mod tests {
12761325 req_method : & mut None ,
12771326 #[ cfg( feature = "ffi" ) ]
12781327 preserve_header_case : false ,
1328+ h09_responses : false ,
12791329 } ,
12801330 )
12811331 . expect ( "parse ok" )
@@ -1291,6 +1341,7 @@ mod tests {
12911341 req_method : & mut None ,
12921342 #[ cfg( feature = "ffi" ) ]
12931343 preserve_header_case : false ,
1344+ h09_responses : false ,
12941345 } ,
12951346 )
12961347 . expect_err ( comment)
@@ -1505,6 +1556,7 @@ mod tests {
15051556 req_method: & mut Some ( Method :: GET ) ,
15061557 #[ cfg( feature = "ffi" ) ]
15071558 preserve_header_case: false ,
1559+ h09_responses: false ,
15081560 }
15091561 )
15101562 . expect( "parse ok" )
@@ -1520,6 +1572,7 @@ mod tests {
15201572 req_method : & mut Some ( m) ,
15211573 #[ cfg( feature = "ffi" ) ]
15221574 preserve_header_case : false ,
1575+ h09_responses : false ,
15231576 } ,
15241577 )
15251578 . expect ( "parse ok" )
@@ -1535,6 +1588,7 @@ mod tests {
15351588 req_method : & mut Some ( Method :: GET ) ,
15361589 #[ cfg( feature = "ffi" ) ]
15371590 preserve_header_case : false ,
1591+ h09_responses : false ,
15381592 } ,
15391593 )
15401594 . expect_err ( "parse should err" )
@@ -1850,6 +1904,7 @@ mod tests {
18501904 req_method : & mut Some ( Method :: GET ) ,
18511905 #[ cfg( feature = "ffi" ) ]
18521906 preserve_header_case : false ,
1907+ h09_responses : false ,
18531908 } ,
18541909 )
18551910 . expect ( "parse ok" )
@@ -1931,6 +1986,7 @@ mod tests {
19311986 req_method : & mut None ,
19321987 #[ cfg( feature = "ffi" ) ]
19331988 preserve_header_case : false ,
1989+ h09_responses : false ,
19341990 } ,
19351991 )
19361992 . unwrap ( )
@@ -1966,6 +2022,7 @@ mod tests {
19662022 req_method : & mut None ,
19672023 #[ cfg( feature = "ffi" ) ]
19682024 preserve_header_case : false ,
2025+ h09_responses : false ,
19692026 } ,
19702027 )
19712028 . unwrap ( )
0 commit comments