recv_reset resets closed streams with queued EOS frames (#247)

This commit is contained in:
Eliza Weisman
2018-03-27 21:20:16 -07:00
committed by Carl Lerche
parent e61788a57f
commit 23090c9fed
4 changed files with 73 additions and 3 deletions

View File

@@ -575,7 +575,8 @@ impl Prioritize {
loop {
match self.pending_send.pop(store) {
Some(mut stream) => {
trace!("pop_frame; stream={:?}", stream.id);
trace!("pop_frame; stream={:?}; stream.state={:?}",
stream.id, stream.state);
// If the stream receives a RESET from the peer, it may have
// had data buffered to be sent, but all the frames are cleared

View File

@@ -590,7 +590,7 @@ impl Recv {
/// Handle remote sending an explicit RST_STREAM.
pub fn recv_reset(&mut self, frame: frame::Reset, stream: &mut Stream) {
// Notify the stream
stream.state.recv_reset(frame.reason());
stream.state.recv_reset(frame.reason(), stream.is_pending_send);
stream.notify_send();
stream.notify_recv();

View File

@@ -214,8 +214,15 @@ impl State {
}
/// The remote explicitly sent a RST_STREAM.
pub fn recv_reset(&mut self, reason: Reason) {
pub fn recv_reset(&mut self, reason: Reason, queued: bool) {
match self.inner {
Closed(Cause::EndStream) if queued => {
// If the stream has a queued EOS frame, transition to peer
// reset.
trace!("recv_reset: reason={:?}; queued=true", reason);
self.inner = Closed(Cause::Proto(reason));
},
Closed(..) => {},
_ => {
trace!("recv_reset; reason={:?}", reason);