Fix panic if remote causes local to reset a stream before opening
This commit is contained in:
		| @@ -1022,3 +1022,60 @@ async fn srv_window_update_on_lower_stream_id() { | ||||
|     }; | ||||
|     join(srv, client).await; | ||||
| } | ||||
|  | ||||
| // See https://github.com/hyperium/h2/issues/570 | ||||
| #[tokio::test] | ||||
| async fn reset_new_stream_before_send() { | ||||
|     h2_support::trace_init!(); | ||||
|     let (io, mut srv) = mock::new(); | ||||
|  | ||||
|     let srv = async move { | ||||
|         let settings = srv.assert_client_handshake().await; | ||||
|         assert_default_settings!(settings); | ||||
|         srv.recv_frame( | ||||
|             frames::headers(1) | ||||
|                 .request("GET", "https://example.com/") | ||||
|                 .eos(), | ||||
|         ) | ||||
|         .await; | ||||
|         srv.send_frame(frames::headers(1).response(200).eos()).await; | ||||
|         // Send unexpected headers, that depends on itself, causing a framing error. | ||||
|         srv.send_bytes(&[ | ||||
|             0, 0, 0x6,  // len | ||||
|             0x1,  // type (headers) | ||||
|             0x25, // flags (eos, eoh, pri) | ||||
|             0, 0, 0, 0x3, // stream id | ||||
|             0, 0, 0, 0x3,  // dependency | ||||
|             2,    // weight | ||||
|             0x88, // HPACK :status=200 | ||||
|         ]) | ||||
|         .await; | ||||
|         srv.recv_frame(frames::reset(3).protocol_error()).await; | ||||
|         srv.recv_frame( | ||||
|             frames::headers(5) | ||||
|                 .request("GET", "https://example.com/") | ||||
|                 .eos(), | ||||
|         ) | ||||
|         .await; | ||||
|         srv.send_frame(frames::headers(5).response(200).eos()).await; | ||||
|     }; | ||||
|  | ||||
|     let client = async move { | ||||
|         let (mut client, mut conn) = client::handshake(io).await.expect("handshake"); | ||||
|         let resp = conn | ||||
|             .drive(client.get("https://example.com/")) | ||||
|             .await | ||||
|             .unwrap(); | ||||
|         assert_eq!(resp.status(), StatusCode::OK); | ||||
|  | ||||
|         // req number 2 | ||||
|         let resp = conn | ||||
|             .drive(client.get("https://example.com/")) | ||||
|             .await | ||||
|             .unwrap(); | ||||
|         assert_eq!(resp.status(), StatusCode::OK); | ||||
|         conn.await.expect("client"); | ||||
|     }; | ||||
|  | ||||
|     join(srv, client).await; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user