fix panic when a stream is canceled (#164)
This commit is contained in:
		| @@ -507,7 +507,6 @@ impl Prioritize { | |||||||
|             match self.pending_send.pop(store) { |             match self.pending_send.pop(store) { | ||||||
|                 Some(mut stream) => { |                 Some(mut stream) => { | ||||||
|                     trace!("pop_frame; stream={:?}", stream.id); |                     trace!("pop_frame; stream={:?}", stream.id); | ||||||
|                     debug_assert!(!stream.pending_send.is_empty()); |  | ||||||
|  |  | ||||||
|                     let is_counted = stream.is_counted(); |                     let is_counted = stream.is_counted(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -135,3 +135,36 @@ fn sent_invalid_authority() { | |||||||
|  |  | ||||||
|     srv.join(client).wait().expect("wait"); |     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"); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -258,6 +258,11 @@ impl Mock<frame::Reset> { | |||||||
|         let id = self.0.stream_id(); |         let id = self.0.stream_id(); | ||||||
|         Mock(frame::Reset::new(id, frame::Reason::REFUSED_STREAM)) |         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<Mock<frame::Reset>> for SendFrame { | impl From<Mock<frame::Reset>> for SendFrame { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user