@@ -58,9 +58,20 @@ enum Inner {
5858 // TODO: these states shouldn't count against concurrency limits:
5959 ReservedLocal ,
6060 ReservedRemote ,
61- Open { local : Peer , remote : Peer } ,
61+ Open {
62+ local : Peer ,
63+ remote : Peer ,
64+ } ,
6265 HalfClosedLocal ( Peer ) , // TODO: explicitly name this value
6366 HalfClosedRemote ( Peer ) ,
67+ /// This indicates to the connection that a reset frame must be sent out
68+ /// once the send queue has been flushed.
69+ ///
70+ /// Examples of when this could happen:
71+ /// - User drops all references to a stream, so we want to CANCEL the it.
72+ /// - Header block size was too large, so we want to REFUSE, possibly
73+ /// after sending a 431 response frame.
74+ ScheduledReset ( Reason ) ,
6475 Closed ( Cause ) ,
6576}
6677
@@ -75,15 +86,6 @@ enum Peer {
7586enum Cause {
7687 EndStream ,
7788 Error ( Error ) ,
78-
79- /// This indicates to the connection that a reset frame must be sent out
80- /// once the send queue has been flushed.
81- ///
82- /// Examples of when this could happen:
83- /// - User drops all references to a stream, so we want to CANCEL the it.
84- /// - Header block size was too large, so we want to REFUSE, possibly
85- /// after sending a 431 response frame.
86- ScheduledLibraryReset ( Reason ) ,
8789}
8890
8991impl State {
@@ -339,24 +341,29 @@ impl State {
339341 /// Set the stream state to a scheduled reset.
340342 pub fn set_scheduled_reset ( & mut self , reason : Reason ) {
341343 debug_assert ! ( !self . is_closed( ) ) ;
342- self . inner = Closed ( Cause :: ScheduledLibraryReset ( reason) ) ;
344+ self . inner = ScheduledReset ( reason)
343345 }
344346
345347 pub fn get_scheduled_reset ( & self ) -> Option < Reason > {
346348 match self . inner {
347- Closed ( Cause :: ScheduledLibraryReset ( reason) ) => Some ( reason) ,
349+ ScheduledReset ( reason) => Some ( reason) ,
348350 _ => None ,
349351 }
350352 }
351353
352354 pub fn is_scheduled_reset ( & self ) -> bool {
353- matches ! ( self . inner, Closed ( Cause :: ScheduledLibraryReset ( ..) ) )
355+ matches ! ( self . inner, ScheduledReset ( _) )
356+ }
357+
358+ pub fn did_schedule_reset ( & mut self ) {
359+ debug_assert ! ( self . is_scheduled_reset( ) ) ;
360+ self . inner = Closed ( Cause :: EndStream ) ;
354361 }
355362
356363 pub fn is_local_error ( & self ) -> bool {
357364 match self . inner {
365+ ScheduledReset ( _) => true ,
358366 Closed ( Cause :: Error ( ref e) ) => e. is_local ( ) ,
359- Closed ( Cause :: ScheduledLibraryReset ( ..) ) => true ,
360367 _ => false ,
361368 }
362369 }
@@ -416,14 +423,14 @@ impl State {
416423 pub fn is_recv_closed ( & self ) -> bool {
417424 matches ! (
418425 self . inner,
419- Closed ( ..) | HalfClosedRemote ( ..) | ReservedLocal
426+ ScheduledReset ( _ ) | Closed ( ..) | HalfClosedRemote ( ..) | ReservedLocal
420427 )
421428 }
422429
423430 pub fn is_send_closed ( & self ) -> bool {
424431 matches ! (
425432 self . inner,
426- Closed ( ..) | HalfClosedLocal ( ..) | ReservedRemote
433+ ScheduledReset ( _ ) | Closed ( ..) | HalfClosedLocal ( ..) | ReservedRemote
427434 )
428435 }
429436
@@ -434,10 +441,8 @@ impl State {
434441 pub fn ensure_recv_open ( & self ) -> Result < bool , proto:: Error > {
435442 // TODO: Is this correct?
436443 match self . inner {
444+ ScheduledReset ( reason) => Err ( proto:: Error :: library_go_away ( reason) ) ,
437445 Closed ( Cause :: Error ( ref e) ) => Err ( e. clone ( ) ) ,
438- Closed ( Cause :: ScheduledLibraryReset ( reason) ) => {
439- Err ( proto:: Error :: library_go_away ( reason) )
440- }
441446 Closed ( Cause :: EndStream ) | HalfClosedRemote ( ..) | ReservedLocal => Ok ( false ) ,
442447 _ => Ok ( true ) ,
443448 }
@@ -446,9 +451,9 @@ impl State {
446451 /// Returns a reason if the stream has been reset.
447452 pub ( super ) fn ensure_reason ( & self , mode : PollReset ) -> Result < Option < Reason > , crate :: Error > {
448453 match self . inner {
449- Closed ( Cause :: Error ( Error :: Reset ( _ , reason, _ ) ) )
450- | Closed ( Cause :: Error ( Error :: GoAway ( _, reason, _) ) )
451- | Closed ( Cause :: ScheduledLibraryReset ( reason) ) => Ok ( Some ( reason) ) ,
454+ ScheduledReset ( reason)
455+ | Closed ( Cause :: Error ( Error :: Reset ( _, reason, _) ) )
456+ | Closed ( Cause :: Error ( Error :: GoAway ( _ , reason, _ ) ) ) => Ok ( Some ( reason) ) ,
452457 Closed ( Cause :: Error ( ref e) ) => Err ( e. clone ( ) . into ( ) ) ,
453458 Open {
454459 local : Streaming , ..
0 commit comments