@@ -690,8 +690,8 @@ impl Http1Transaction for Client {
690
690
) ;
691
691
let mut res = httparse:: Response :: new ( & mut headers) ;
692
692
let bytes = buf. as_ref ( ) ;
693
- match res. parse ( bytes) ? {
694
- httparse:: Status :: Complete ( len) => {
693
+ match res. parse ( bytes) {
694
+ Ok ( httparse:: Status :: Complete ( len) ) => {
695
695
trace ! ( "Response.parse Complete({})" , len) ;
696
696
let status = StatusCode :: from_u16 ( res. code . unwrap ( ) ) ?;
697
697
@@ -717,7 +717,18 @@ impl Http1Transaction for Client {
717
717
let headers_len = res. headers . len ( ) ;
718
718
( len, status, reason, version, headers_len)
719
719
}
720
- httparse:: Status :: Partial => return Ok ( None ) ,
720
+ Ok ( httparse:: Status :: Partial ) => return Ok ( None ) ,
721
+ Err ( httparse:: Error :: Version ) if ctx. h09_responses => {
722
+ trace ! ( "Response.parse accepted HTTP/0.9 response" ) ;
723
+
724
+ #[ cfg( not( feature = "ffi" ) ) ]
725
+ let reason = ( ) ;
726
+ #[ cfg( feature = "ffi" ) ]
727
+ let reason = None ;
728
+
729
+ ( 0 , StatusCode :: OK , reason, Version :: HTTP_09 , 0 )
730
+ }
731
+ Err ( e) => return Err ( e. into ( ) ) ,
721
732
}
722
733
} ;
723
734
@@ -1229,6 +1240,7 @@ mod tests {
1229
1240
req_method : & mut method,
1230
1241
#[ cfg( feature = "ffi" ) ]
1231
1242
preserve_header_case : false ,
1243
+ h09_responses : false ,
1232
1244
} ,
1233
1245
)
1234
1246
. unwrap ( )
@@ -1251,6 +1263,7 @@ mod tests {
1251
1263
req_method : & mut Some ( crate :: Method :: GET ) ,
1252
1264
#[ cfg( feature = "ffi" ) ]
1253
1265
preserve_header_case : false ,
1266
+ h09_responses : false ,
1254
1267
} ;
1255
1268
let msg = Client :: parse ( & mut raw, ctx) . unwrap ( ) . unwrap ( ) ;
1256
1269
assert_eq ! ( raw. len( ) , 0 ) ;
@@ -1268,10 +1281,46 @@ mod tests {
1268
1281
req_method : & mut None ,
1269
1282
#[ cfg( feature = "ffi" ) ]
1270
1283
preserve_header_case : false ,
1284
+ h09_responses : false ,
1271
1285
} ;
1272
1286
Server :: parse ( & mut raw, ctx) . unwrap_err ( ) ;
1273
1287
}
1274
1288
1289
+ const H09_RESPONSE : & ' static str = "Baguettes are super delicious, don't you agree?" ;
1290
+
1291
+ #[ test]
1292
+ fn test_parse_response_h09_allowed ( ) {
1293
+ let _ = pretty_env_logger:: try_init ( ) ;
1294
+ let mut raw = BytesMut :: from ( H09_RESPONSE ) ;
1295
+ let ctx = ParseContext {
1296
+ cached_headers : & mut None ,
1297
+ req_method : & mut Some ( crate :: Method :: GET ) ,
1298
+ #[ cfg( feature = "ffi" ) ]
1299
+ preserve_header_case : false ,
1300
+ h09_responses : true ,
1301
+ } ;
1302
+ let msg = Client :: parse ( & mut raw, ctx) . unwrap ( ) . unwrap ( ) ;
1303
+ assert_eq ! ( raw, H09_RESPONSE ) ;
1304
+ assert_eq ! ( msg. head. subject, crate :: StatusCode :: OK ) ;
1305
+ assert_eq ! ( msg. head. version, crate :: Version :: HTTP_09 ) ;
1306
+ assert_eq ! ( msg. head. headers. len( ) , 0 ) ;
1307
+ }
1308
+
1309
+ #[ test]
1310
+ fn test_parse_response_h09_rejected ( ) {
1311
+ let _ = pretty_env_logger:: try_init ( ) ;
1312
+ let mut raw = BytesMut :: from ( H09_RESPONSE ) ;
1313
+ let ctx = ParseContext {
1314
+ cached_headers : & mut None ,
1315
+ req_method : & mut Some ( crate :: Method :: GET ) ,
1316
+ #[ cfg( feature = "ffi" ) ]
1317
+ preserve_header_case : false ,
1318
+ h09_responses : false ,
1319
+ } ;
1320
+ Client :: parse ( & mut raw, ctx) . unwrap_err ( ) ;
1321
+ assert_eq ! ( raw, H09_RESPONSE ) ;
1322
+ }
1323
+
1275
1324
#[ test]
1276
1325
fn test_decoder_request ( ) {
1277
1326
fn parse ( s : & str ) -> ParsedMessage < RequestLine > {
@@ -1283,6 +1332,7 @@ mod tests {
1283
1332
req_method : & mut None ,
1284
1333
#[ cfg( feature = "ffi" ) ]
1285
1334
preserve_header_case : false ,
1335
+ h09_responses : false ,
1286
1336
} ,
1287
1337
)
1288
1338
. expect ( "parse ok" )
@@ -1298,6 +1348,7 @@ mod tests {
1298
1348
req_method : & mut None ,
1299
1349
#[ cfg( feature = "ffi" ) ]
1300
1350
preserve_header_case : false ,
1351
+ h09_responses : false ,
1301
1352
} ,
1302
1353
)
1303
1354
. expect_err ( comment)
@@ -1512,6 +1563,7 @@ mod tests {
1512
1563
req_method: & mut Some ( Method :: GET ) ,
1513
1564
#[ cfg( feature = "ffi" ) ]
1514
1565
preserve_header_case: false ,
1566
+ h09_responses: false ,
1515
1567
}
1516
1568
)
1517
1569
. expect( "parse ok" )
@@ -1527,6 +1579,7 @@ mod tests {
1527
1579
req_method : & mut Some ( m) ,
1528
1580
#[ cfg( feature = "ffi" ) ]
1529
1581
preserve_header_case : false ,
1582
+ h09_responses : false ,
1530
1583
} ,
1531
1584
)
1532
1585
. expect ( "parse ok" )
@@ -1542,6 +1595,7 @@ mod tests {
1542
1595
req_method : & mut Some ( Method :: GET ) ,
1543
1596
#[ cfg( feature = "ffi" ) ]
1544
1597
preserve_header_case : false ,
1598
+ h09_responses : false ,
1545
1599
} ,
1546
1600
)
1547
1601
. expect_err ( "parse should err" )
@@ -1857,6 +1911,7 @@ mod tests {
1857
1911
req_method : & mut Some ( Method :: GET ) ,
1858
1912
#[ cfg( feature = "ffi" ) ]
1859
1913
preserve_header_case : false ,
1914
+ h09_responses : false ,
1860
1915
} ,
1861
1916
)
1862
1917
. expect ( "parse ok" )
@@ -1938,6 +1993,7 @@ mod tests {
1938
1993
req_method : & mut None ,
1939
1994
#[ cfg( feature = "ffi" ) ]
1940
1995
preserve_header_case : false ,
1996
+ h09_responses : false ,
1941
1997
} ,
1942
1998
)
1943
1999
. unwrap ( )
@@ -1973,6 +2029,7 @@ mod tests {
1973
2029
req_method : & mut None ,
1974
2030
#[ cfg( feature = "ffi" ) ]
1975
2031
preserve_header_case : false ,
2032
+ h09_responses : false ,
1976
2033
} ,
1977
2034
)
1978
2035
. unwrap ( )
0 commit comments