recv_reset resets closed streams with queued EOS frames (#247)
This commit is contained in:
committed by
Carl Lerche
parent
e61788a57f
commit
23090c9fed
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user