From 75db1863789d44d718bf26d9a198dc91a5a1a1b6 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Fri, 20 Oct 2017 17:47:58 -0700 Subject: [PATCH] fix panic when a stream is canceled (#164) --- src/proto/streams/prioritize.rs | 1 - tests/server.rs | 33 +++++++++++++++++++++++++++++++++ tests/support/frames.rs | 5 +++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/proto/streams/prioritize.rs b/src/proto/streams/prioritize.rs index 0814a1e..e2c045c 100644 --- a/src/proto/streams/prioritize.rs +++ b/src/proto/streams/prioritize.rs @@ -507,7 +507,6 @@ impl Prioritize { match self.pending_send.pop(store) { Some(mut stream) => { trace!("pop_frame; stream={:?}", stream.id); - debug_assert!(!stream.pending_send.is_empty()); let is_counted = stream.is_counted(); diff --git a/tests/server.rs b/tests/server.rs index 736e31e..61f3eb0 100644 --- a/tests/server.rs +++ b/tests/server.rs @@ -135,3 +135,36 @@ fn sent_invalid_authority() { srv.join(client).wait().expect("wait"); } + +#[test] +fn sends_reset_cancel_when_body_is_dropped() { + let _ = ::env_logger::init(); + let (io, client) = mock::new(); + + let client = client + .assert_server_handshake() + .unwrap() + .recv_settings() + .send_frame( + frames::headers(1) + .request("POST", "https://example.com/") + ) + .recv_frame(frames::headers(1).response(200).eos()) + .recv_frame(frames::reset(1).cancel()) + .close(); + + let srv = Server::handshake(io).expect("handshake").and_then(|srv| { + srv.into_future().unwrap().and_then(|(reqstream, srv)| { + let (req, mut stream) = reqstream.unwrap(); + + assert_eq!(req.method(), &http::Method::POST); + + let rsp = http::Response::builder().status(200).body(()).unwrap(); + stream.send_response(rsp, true).unwrap(); + + srv.into_future().unwrap() + }) + }); + + srv.join(client).wait().expect("wait"); +} diff --git a/tests/support/frames.rs b/tests/support/frames.rs index aa2775a..21f2b1b 100644 --- a/tests/support/frames.rs +++ b/tests/support/frames.rs @@ -258,6 +258,11 @@ impl Mock { let id = self.0.stream_id(); Mock(frame::Reset::new(id, frame::Reason::REFUSED_STREAM)) } + + pub fn cancel(self) -> Self { + let id = self.0.stream_id(); + Mock(frame::Reset::new(id, frame::Reason::CANCEL)) + } } impl From> for SendFrame {