File tree 4 files changed +51
-11
lines changed
4 files changed +51
-11
lines changed Original file line number Diff line number Diff line change @@ -251,14 +251,15 @@ impl Recv {
251
251
}
252
252
253
253
/// Called by the server to get the request
254
- ///
255
- /// TODO: Should this fn return `Result`?
256
- pub fn take_request ( & mut self , stream : & mut store:: Ptr ) -> Request < ( ) > {
254
+ pub fn take_request ( & mut self , stream : & mut store:: Ptr ) -> Result < Request < ( ) > , proto:: Error > {
257
255
use super :: peer:: PollMessage :: * ;
258
256
259
257
match stream. pending_recv . pop_front ( & mut self . buffer ) {
260
- Some ( Event :: Headers ( Server ( request) ) ) => request,
261
- _ => panic ! ( ) ,
258
+ Some ( Event :: Headers ( Server ( request) ) ) => Ok ( request) ,
259
+ _ => {
260
+ proto_err ! ( stream: "received invalid request; stream={:?}" , stream. id) ;
261
+ Err ( Error :: library_reset ( stream. id , Reason :: PROTOCOL_ERROR ) )
262
+ }
262
263
}
263
264
}
264
265
Original file line number Diff line number Diff line change @@ -1178,7 +1178,7 @@ impl<B> StreamRef<B> {
1178
1178
/// # Panics
1179
1179
///
1180
1180
/// This function panics if the request isn't present.
1181
- pub fn take_request ( & self ) -> Request < ( ) > {
1181
+ pub fn take_request ( & self ) -> Result < Request < ( ) > , proto :: Error > {
1182
1182
let mut me = self . opaque . inner . lock ( ) . unwrap ( ) ;
1183
1183
let me = & mut * me;
1184
1184
Original file line number Diff line number Diff line change @@ -425,13 +425,20 @@ where
425
425
426
426
if let Some ( inner) = self . connection . next_incoming ( ) {
427
427
tracing:: trace!( "received incoming" ) ;
428
- let ( head, _) = inner. take_request ( ) . into_parts ( ) ;
429
- let body = RecvStream :: new ( FlowControl :: new ( inner. clone_to_opaque ( ) ) ) ;
428
+ match inner. take_request ( ) {
429
+ Ok ( req) => {
430
+ let ( head, _) = req. into_parts ( ) ;
431
+ let body = RecvStream :: new ( FlowControl :: new ( inner. clone_to_opaque ( ) ) ) ;
430
432
431
- let request = Request :: from_parts ( head, body) ;
432
- let respond = SendResponse { inner } ;
433
+ let request = Request :: from_parts ( head, body) ;
434
+ let respond = SendResponse { inner } ;
433
435
434
- return Poll :: Ready ( Some ( Ok ( ( request, respond) ) ) ) ;
436
+ return Poll :: Ready ( Some ( Ok ( ( request, respond) ) ) ) ;
437
+ }
438
+ Err ( e) => {
439
+ return Poll :: Ready ( Some ( Err ( e. into ( ) ) ) ) ;
440
+ }
441
+ }
435
442
}
436
443
437
444
Poll :: Pending
Original file line number Diff line number Diff line change @@ -1378,3 +1378,35 @@ async fn reject_non_authority_target_on_connect_request() {
1378
1378
1379
1379
join ( client, srv) . await ;
1380
1380
}
1381
+
1382
+ #[ tokio:: test]
1383
+ async fn reject_response_headers_in_request ( ) {
1384
+ h2_support:: trace_init!( ) ;
1385
+
1386
+ let ( io, mut client) = mock:: new ( ) ;
1387
+
1388
+ let client = async move {
1389
+ let _ = client. assert_server_handshake ( ) . await ;
1390
+
1391
+ client. send_frame ( frames:: headers ( 1 ) . response ( 128 ) ) . await ;
1392
+
1393
+ // TODO: is CANCEL the right error code to expect here?
1394
+ client. recv_frame ( frames:: reset ( 1 ) . cancel ( ) ) . await ;
1395
+ } ;
1396
+
1397
+ let srv = async move {
1398
+ let builder = server:: Builder :: new ( ) ;
1399
+ let mut srv = builder. handshake :: < _ , Bytes > ( io) . await . expect ( "handshake" ) ;
1400
+
1401
+ let res = srv. next ( ) . await ;
1402
+ tracing:: warn!( "{:?}" , res) ;
1403
+ assert ! ( res. is_some( ) ) ;
1404
+ assert ! ( res. unwrap( ) . is_err( ) ) ;
1405
+
1406
+ poll_fn ( move |cx| srv. poll_closed ( cx) )
1407
+ . await
1408
+ . expect ( "server" ) ;
1409
+ } ;
1410
+
1411
+ join ( client, srv) . await ;
1412
+ }
You can’t perform that action at this time.
0 commit comments