@@ -2366,7 +2366,7 @@ void test_nghttp2_session_on_request_headers_received(void) {
23662366
23672367 nghttp2_frame_headers_free (& frame .headers , mem );
23682368 session -> local_settings .max_concurrent_streams =
2369- NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS ;
2369+ NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS ;
23702370
23712371 /* Stream ID less than or equal to the previouly received request
23722372 HEADERS is just ignored due to race condition */
@@ -5042,7 +5042,7 @@ void test_nghttp2_submit_settings(void) {
50425042 nghttp2_submit_settings (session , NGHTTP2_FLAG_NONE , iv , 7 ));
50435043
50445044 /* Make sure that local settings are not changed */
5045- CU_ASSERT (NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS ==
5045+ CU_ASSERT (NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS ==
50465046 session -> local_settings .max_concurrent_streams );
50475047 CU_ASSERT (NGHTTP2_INITIAL_WINDOW_SIZE ==
50485048 session -> local_settings .initial_window_size );
@@ -9715,6 +9715,186 @@ void test_nghttp2_session_cancel_from_before_frame_send(void) {
97159715 nghttp2_session_del (session );
97169716}
97179717
9718+ static void
9719+ prepare_session_removed_closed_stream (nghttp2_session * session ,
9720+ nghttp2_hd_deflater * deflater ) {
9721+ int rv ;
9722+ nghttp2_settings_entry iv ;
9723+ nghttp2_bufs bufs ;
9724+ nghttp2_mem * mem ;
9725+ ssize_t nread ;
9726+ int i ;
9727+ nghttp2_stream * stream ;
9728+ nghttp2_frame_hd hd ;
9729+
9730+ mem = nghttp2_mem_default ();
9731+
9732+ frame_pack_bufs_init (& bufs );
9733+
9734+ iv .settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS ;
9735+ iv .value = 2 ;
9736+
9737+ rv = nghttp2_submit_settings (session , NGHTTP2_FLAG_NONE , & iv , 1 );
9738+
9739+ CU_ASSERT (0 == rv );
9740+
9741+ rv = nghttp2_session_send (session );
9742+
9743+ CU_ASSERT (0 == rv );
9744+
9745+ for (i = 1 ; i <= 3 ; i += 2 ) {
9746+ rv = pack_headers (& bufs , deflater , i ,
9747+ NGHTTP2_FLAG_END_HEADERS | NGHTTP2_FLAG_END_STREAM , reqnv ,
9748+ ARRLEN (reqnv ), mem );
9749+
9750+ CU_ASSERT (0 == rv );
9751+
9752+ nread = nghttp2_session_mem_recv (session , bufs .head -> buf .pos ,
9753+ nghttp2_bufs_len (& bufs ));
9754+
9755+ CU_ASSERT ((ssize_t )nghttp2_bufs_len (& bufs ) == nread );
9756+
9757+ nghttp2_bufs_reset (& bufs );
9758+ }
9759+
9760+ nghttp2_session_close_stream (session , 3 , NGHTTP2_NO_ERROR );
9761+
9762+ rv = pack_headers (& bufs , deflater , 5 ,
9763+ NGHTTP2_FLAG_END_HEADERS | NGHTTP2_FLAG_END_STREAM , reqnv ,
9764+ ARRLEN (reqnv ), mem );
9765+
9766+ CU_ASSERT (0 == rv );
9767+
9768+ /* Receiving stream 5 will erase stream 3 from closed stream list */
9769+ nread = nghttp2_session_mem_recv (session , bufs .head -> buf .pos ,
9770+ nghttp2_bufs_len (& bufs ));
9771+
9772+ CU_ASSERT ((ssize_t )nghttp2_bufs_len (& bufs ) == nread );
9773+
9774+ stream = nghttp2_session_get_stream_raw (session , 3 );
9775+
9776+ CU_ASSERT (NULL == stream );
9777+
9778+ /* Since the current max concurrent streams is
9779+ NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS, receiving frame on stream
9780+ 3 is ignored. */
9781+ nghttp2_bufs_reset (& bufs );
9782+ rv = pack_headers (& bufs , deflater , 3 ,
9783+ NGHTTP2_FLAG_END_HEADERS | NGHTTP2_FLAG_END_STREAM ,
9784+ trailernv , ARRLEN (trailernv ), mem );
9785+
9786+ CU_ASSERT (0 == rv );
9787+
9788+ nread = nghttp2_session_mem_recv (session , bufs .head -> buf .pos ,
9789+ nghttp2_bufs_len (& bufs ));
9790+
9791+ CU_ASSERT ((ssize_t )nghttp2_bufs_len (& bufs ) == nread );
9792+ CU_ASSERT (NULL == nghttp2_session_get_next_ob_item (session ));
9793+
9794+ nghttp2_frame_hd_init (& hd , 0 , NGHTTP2_DATA , NGHTTP2_FLAG_NONE , 3 );
9795+ nghttp2_bufs_reset (& bufs );
9796+ nghttp2_frame_pack_frame_hd (bufs .head -> buf .last , & hd );
9797+ bufs .head -> buf .last += NGHTTP2_FRAME_HDLEN ;
9798+
9799+ nread = nghttp2_session_mem_recv (session , bufs .head -> buf .pos ,
9800+ nghttp2_bufs_len (& bufs ));
9801+
9802+ CU_ASSERT ((ssize_t )nghttp2_bufs_len (& bufs ) == nread );
9803+ CU_ASSERT (NULL == nghttp2_session_get_next_ob_item (session ));
9804+
9805+ /* Now server receives SETTINGS ACK */
9806+ nghttp2_frame_hd_init (& hd , 0 , NGHTTP2_SETTINGS , NGHTTP2_FLAG_ACK , 0 );
9807+ nghttp2_bufs_reset (& bufs );
9808+ nghttp2_frame_pack_frame_hd (bufs .head -> buf .last , & hd );
9809+ bufs .head -> buf .last += NGHTTP2_FRAME_HDLEN ;
9810+
9811+ nread = nghttp2_session_mem_recv (session , bufs .head -> buf .pos ,
9812+ nghttp2_bufs_len (& bufs ));
9813+
9814+ CU_ASSERT ((ssize_t )nghttp2_bufs_len (& bufs ) == nread );
9815+
9816+ nghttp2_bufs_free (& bufs );
9817+ }
9818+
9819+ void test_nghttp2_session_removed_closed_stream (void ) {
9820+ nghttp2_session * session ;
9821+ nghttp2_session_callbacks callbacks ;
9822+ int rv ;
9823+ nghttp2_hd_deflater deflater ;
9824+ nghttp2_bufs bufs ;
9825+ nghttp2_mem * mem ;
9826+ ssize_t nread ;
9827+ nghttp2_frame_hd hd ;
9828+ nghttp2_outbound_item * item ;
9829+
9830+ mem = nghttp2_mem_default ();
9831+
9832+ frame_pack_bufs_init (& bufs );
9833+
9834+ memset (& callbacks , 0 , sizeof (callbacks ));
9835+
9836+ callbacks .send_callback = null_send_callback ;
9837+
9838+ nghttp2_session_server_new (& session , & callbacks , NULL );
9839+
9840+ /* Now local max concurrent streams is still unlimited, pending max
9841+ concurrent streams is now 2. */
9842+
9843+ nghttp2_hd_deflate_init (& deflater , mem );
9844+
9845+ prepare_session_removed_closed_stream (session , & deflater );
9846+
9847+ /* Now current max concurrent streams is 2, so receiving frame on
9848+ stream 3 is treated as connection error */
9849+ nghttp2_bufs_reset (& bufs );
9850+ rv = pack_headers (& bufs , & deflater , 3 ,
9851+ NGHTTP2_FLAG_END_HEADERS | NGHTTP2_FLAG_END_STREAM ,
9852+ trailernv , ARRLEN (trailernv ), mem );
9853+
9854+ CU_ASSERT (0 == rv );
9855+
9856+ nread = nghttp2_session_mem_recv (session , bufs .head -> buf .pos ,
9857+ nghttp2_bufs_len (& bufs ));
9858+
9859+ CU_ASSERT ((ssize_t )nghttp2_bufs_len (& bufs ) == nread );
9860+
9861+ item = nghttp2_session_get_next_ob_item (session );
9862+
9863+ CU_ASSERT (NULL != item );
9864+ CU_ASSERT (NGHTTP2_GOAWAY == item -> frame .hd .type );
9865+ CU_ASSERT (NGHTTP2_PROTOCOL_ERROR == item -> frame .goaway .error_code );
9866+
9867+ nghttp2_hd_deflate_free (& deflater );
9868+ nghttp2_session_del (session );
9869+
9870+ nghttp2_session_server_new (& session , & callbacks , NULL );
9871+ nghttp2_hd_deflate_init (& deflater , mem );
9872+ /* Same setup, and then receive DATA instead of HEADERS */
9873+
9874+ prepare_session_removed_closed_stream (session , & deflater );
9875+
9876+ nghttp2_frame_hd_init (& hd , 0 , NGHTTP2_DATA , NGHTTP2_FLAG_NONE , 3 );
9877+ nghttp2_bufs_reset (& bufs );
9878+ nghttp2_frame_pack_frame_hd (bufs .head -> buf .last , & hd );
9879+ bufs .head -> buf .last += NGHTTP2_FRAME_HDLEN ;
9880+
9881+ nread = nghttp2_session_mem_recv (session , bufs .head -> buf .pos ,
9882+ nghttp2_bufs_len (& bufs ));
9883+
9884+ CU_ASSERT ((ssize_t )nghttp2_bufs_len (& bufs ) == nread );
9885+
9886+ item = nghttp2_session_get_next_ob_item (session );
9887+
9888+ CU_ASSERT (NULL != item );
9889+ CU_ASSERT (NGHTTP2_GOAWAY == item -> frame .hd .type );
9890+ CU_ASSERT (NGHTTP2_PROTOCOL_ERROR == item -> frame .goaway .error_code );
9891+
9892+ nghttp2_hd_deflate_free (& deflater );
9893+ nghttp2_session_del (session );
9894+
9895+ nghttp2_bufs_free (& bufs );
9896+ }
9897+
97189898static void check_nghttp2_http_recv_headers_fail (
97199899 nghttp2_session * session , nghttp2_hd_deflater * deflater , int32_t stream_id ,
97209900 int stream_state , const nghttp2_nv * nva , size_t nvlen ) {
0 commit comments