@@ -2070,6 +2070,10 @@ impl Connection {
20702070 return Ok ( ( finished, Event :: Finished ) ) ;
20712071 }
20722072
2073+ for stream_id in conn. streams . collected_streams ( ) {
2074+ self . streams . remove ( & stream_id) ;
2075+ }
2076+
20732077 Err ( Error :: Done )
20742078 }
20752079
@@ -3211,6 +3215,13 @@ impl Connection {
32113215 . decoder_stream_bytes ,
32123216 }
32133217 }
3218+
3219+ #[ cfg( test) ]
3220+ /// Indicates how many streams are currently being tracked for use
3221+ /// in resource tests.
3222+ pub fn stream_count ( & self ) -> usize {
3223+ self . streams . len ( )
3224+ }
32143225}
32153226
32163227/// Generates an HTTP/3 GREASE variable length integer.
@@ -7349,6 +7360,68 @@ mod tests {
73497360 assert_eq ! ( s. poll_client( ) , Ok ( ( stream, Event :: Finished ) ) ) ;
73507361 assert_eq ! ( s. poll_client( ) , Err ( Error :: Done ) ) ;
73517362 }
7363+
7364+ #[ test]
7365+ fn h3_cleanup_streams ( ) {
7366+ let mut buf = [ 0 ; 65535 ] ;
7367+ let mut s = Session :: new ( ) . unwrap ( ) ;
7368+ s. handshake ( ) . unwrap ( ) ;
7369+
7370+ let init_streams_client = s. client . stream_count ( ) ;
7371+ let init_streams_server = s. client . stream_count ( ) ;
7372+
7373+ // Client sends HEADERS and doesn't fin
7374+ let ( stream, req) = s. send_request ( false ) . unwrap ( ) ;
7375+
7376+ let ev_headers = Event :: Headers {
7377+ list : req,
7378+ more_frames : true ,
7379+ } ;
7380+
7381+ // Server receives headers.
7382+ assert_eq ! ( s. poll_server( ) , Ok ( ( stream, ev_headers) ) ) ;
7383+ assert_eq ! ( s. poll_server( ) , Err ( Error :: Done ) ) ;
7384+
7385+ assert_eq ! ( s. client. stream_count( ) , init_streams_client + 1 ) ;
7386+ assert_eq ! ( s. server. stream_count( ) , init_streams_server + 1 ) ;
7387+
7388+ // Client sends body and fin
7389+ let body = s. send_body_client ( stream, true ) . unwrap ( ) ;
7390+
7391+ let mut recv_buf = vec ! [ 0 ; body. len( ) ] ;
7392+
7393+ assert_eq ! ( s. poll_server( ) , Ok ( ( stream, Event :: Data ) ) ) ;
7394+ assert_eq ! ( s. recv_body_server( stream, & mut recv_buf) , Ok ( body. len( ) ) ) ;
7395+
7396+ assert_eq ! ( s. poll_server( ) , Ok ( ( stream, Event :: Finished ) ) ) ;
7397+
7398+ assert_eq ! ( s. client. stream_count( ) , init_streams_client + 1 ) ;
7399+ assert_eq ! ( s. server. stream_count( ) , init_streams_server + 1 ) ;
7400+
7401+ // Server sends response and finishes the stream
7402+ let resp_headers = s. send_response ( stream, false ) . unwrap ( ) ;
7403+ let resp_body = s. send_body_server ( stream, true ) . unwrap ( ) ;
7404+
7405+ let mut resp_recv_buf = vec ! [ 0 ; resp_body. len( ) ] ;
7406+
7407+ let ev_headers = Event :: Headers {
7408+ list : resp_headers,
7409+ more_frames : true ,
7410+ } ;
7411+
7412+ assert_eq ! ( s. poll_client( ) , Ok ( ( stream, ev_headers) ) ) ;
7413+ assert_eq ! ( s. poll_client( ) , Ok ( ( stream, Event :: Data ) ) ) ;
7414+ assert_eq ! ( s. recv_body_client( stream, & mut recv_buf) , Ok ( body. len( ) ) ) ;
7415+
7416+ // The server stream should be gone now
7417+ assert_eq ! ( s. client. stream_count( ) , init_streams_client + 1 ) ;
7418+ assert_eq ! ( s. server. stream_count( ) , init_streams_server) ;
7419+
7420+ // Polling again should clean up the client
7421+ assert_eq ! ( s. poll_client( ) , Ok ( ( stream, Event :: Finished ) ) ) ;
7422+ assert_eq ! ( s. poll_client( ) , Err ( Error :: Done ) ) ;
7423+ assert_eq ! ( s. client. stream_count( ) , init_streams_client) ;
7424+ }
73527425}
73537426
73547427#[ cfg( feature = "ffi" ) ]
0 commit comments