nghttp2_session_mem_send: Handle stream closure early
Previously session_after_frame_sent is called after we detected all data is sent. In nghttp2_session_mem_send, we only detect it in the next call of the function. It means that if a frame data bearing END_STREAM is on flight to the peer as a result of nghttp2_session_mem_send, peer may get that data and knows the stream closure and issues new stream. We may receive this new stream before the next nghttp2_session_mem_send call, which means that we may incorrectly assumes that peer violates maximum concurrent stream limit. To fix this issue, we separate session_after_frame_sent into 2 functions: session_after_frame_sent1 and session_after_frame_sent2. session_after_frame_sent1 handles on_frame_send_callback and stream closure and we call this early in nghttp2_session_mem_send. This makes number of streams are synchronized correctly with peer.
Showing
Please register or sign in to comment