@@ -683,8 +683,8 @@ impl Http1Transaction for Client {
683
683
) ;
684
684
let mut res = httparse:: Response :: new ( & mut headers) ;
685
685
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) ) => {
688
688
trace ! ( "Response.parse Complete({})" , len) ;
689
689
let status = StatusCode :: from_u16 ( res. code . unwrap ( ) ) ?;
690
690
@@ -710,7 +710,18 @@ impl Http1Transaction for Client {
710
710
let headers_len = res. headers . len ( ) ;
711
711
( len, status, reason, version, headers_len)
712
712
}
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 ( ) ) ,
714
725
}
715
726
} ;
716
727
@@ -1222,6 +1233,7 @@ mod tests {
1222
1233
req_method : & mut method,
1223
1234
#[ cfg( feature = "ffi" ) ]
1224
1235
preserve_header_case : false ,
1236
+ h09_responses : false ,
1225
1237
} ,
1226
1238
)
1227
1239
. unwrap ( )
@@ -1244,6 +1256,7 @@ mod tests {
1244
1256
req_method : & mut Some ( crate :: Method :: GET ) ,
1245
1257
#[ cfg( feature = "ffi" ) ]
1246
1258
preserve_header_case : false ,
1259
+ h09_responses : false ,
1247
1260
} ;
1248
1261
let msg = Client :: parse ( & mut raw, ctx) . unwrap ( ) . unwrap ( ) ;
1249
1262
assert_eq ! ( raw. len( ) , 0 ) ;
@@ -1261,10 +1274,46 @@ mod tests {
1261
1274
req_method : & mut None ,
1262
1275
#[ cfg( feature = "ffi" ) ]
1263
1276
preserve_header_case : false ,
1277
+ h09_responses : false ,
1264
1278
} ;
1265
1279
Server :: parse ( & mut raw, ctx) . unwrap_err ( ) ;
1266
1280
}
1267
1281
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
+
1268
1317
#[ test]
1269
1318
fn test_decoder_request ( ) {
1270
1319
fn parse ( s : & str ) -> ParsedMessage < RequestLine > {
@@ -1276,6 +1325,7 @@ mod tests {
1276
1325
req_method : & mut None ,
1277
1326
#[ cfg( feature = "ffi" ) ]
1278
1327
preserve_header_case : false ,
1328
+ h09_responses : false ,
1279
1329
} ,
1280
1330
)
1281
1331
. expect ( "parse ok" )
@@ -1291,6 +1341,7 @@ mod tests {
1291
1341
req_method : & mut None ,
1292
1342
#[ cfg( feature = "ffi" ) ]
1293
1343
preserve_header_case : false ,
1344
+ h09_responses : false ,
1294
1345
} ,
1295
1346
)
1296
1347
. expect_err ( comment)
@@ -1505,6 +1556,7 @@ mod tests {
1505
1556
req_method: & mut Some ( Method :: GET ) ,
1506
1557
#[ cfg( feature = "ffi" ) ]
1507
1558
preserve_header_case: false ,
1559
+ h09_responses: false ,
1508
1560
}
1509
1561
)
1510
1562
. expect( "parse ok" )
@@ -1520,6 +1572,7 @@ mod tests {
1520
1572
req_method : & mut Some ( m) ,
1521
1573
#[ cfg( feature = "ffi" ) ]
1522
1574
preserve_header_case : false ,
1575
+ h09_responses : false ,
1523
1576
} ,
1524
1577
)
1525
1578
. expect ( "parse ok" )
@@ -1535,6 +1588,7 @@ mod tests {
1535
1588
req_method : & mut Some ( Method :: GET ) ,
1536
1589
#[ cfg( feature = "ffi" ) ]
1537
1590
preserve_header_case : false ,
1591
+ h09_responses : false ,
1538
1592
} ,
1539
1593
)
1540
1594
. expect_err ( "parse should err" )
@@ -1850,6 +1904,7 @@ mod tests {
1850
1904
req_method : & mut Some ( Method :: GET ) ,
1851
1905
#[ cfg( feature = "ffi" ) ]
1852
1906
preserve_header_case : false ,
1907
+ h09_responses : false ,
1853
1908
} ,
1854
1909
)
1855
1910
. expect ( "parse ok" )
@@ -1931,6 +1986,7 @@ mod tests {
1931
1986
req_method : & mut None ,
1932
1987
#[ cfg( feature = "ffi" ) ]
1933
1988
preserve_header_case : false ,
1989
+ h09_responses : false ,
1934
1990
} ,
1935
1991
)
1936
1992
. unwrap ( )
@@ -1966,6 +2022,7 @@ mod tests {
1966
2022
req_method : & mut None ,
1967
2023
#[ cfg( feature = "ffi" ) ]
1968
2024
preserve_header_case : false ,
2025
+ h09_responses : false ,
1969
2026
} ,
1970
2027
)
1971
2028
. unwrap ( )
0 commit comments