Allow frame submission immediately after nghttp2_submit_{request,headers,pp}
This commit makes handling of outgoing HEADERS and PUSH_PROMISE in the same priority of other frames on the stream, so these frames are processed in the order they are submitted. This allows application to submit frames to a stream returned by nghttp2_submit_{request, headers, push_promise} immediately. The only exception is WINDOW_UPDATA frame, which requires nghttp2_stream object, which is not created yet.
This commit is contained in:
parent
49a9ec2cb3
commit
bbe4f5a3d1
|
@ -2239,11 +2239,13 @@ int nghttp2_priority_spec_check_default(const nghttp2_priority_spec *pri_spec);
|
||||||
*
|
*
|
||||||
* .. warning::
|
* .. warning::
|
||||||
*
|
*
|
||||||
* This function returns assigned stream ID if it succeeds. But
|
* This function returns assigned stream ID if it succeeds and
|
||||||
* that stream is not opened yet. The application must not submit
|
* |stream_id| is -1. But that stream is not opened yet. The
|
||||||
* frame to that stream ID before
|
* application must not submit WINDOW_UPDATE frame using
|
||||||
|
* `nghttp2_submit_window_update()` to that stream ID before
|
||||||
* :member:`nghttp2_session_callbacks.before_frame_send_callback` is
|
* :member:`nghttp2_session_callbacks.before_frame_send_callback` is
|
||||||
* called for this frame.
|
* called for this frame. Other types of frames can be submitted to
|
||||||
|
* the returned stream ID.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int32_t nghttp2_submit_request(nghttp2_session *session,
|
int32_t nghttp2_submit_request(nghttp2_session *session,
|
||||||
|
@ -2367,9 +2369,11 @@ int nghttp2_submit_response(nghttp2_session *session,
|
||||||
*
|
*
|
||||||
* This function returns assigned stream ID if it succeeds and
|
* This function returns assigned stream ID if it succeeds and
|
||||||
* |stream_id| is -1. But that stream is not opened yet. The
|
* |stream_id| is -1. But that stream is not opened yet. The
|
||||||
* application must not submit frame to that stream ID before
|
* application must not submit WINDOW_UPDATE frame using
|
||||||
|
* `nghttp2_submit_window_update()` to that stream ID before
|
||||||
* :member:`nghttp2_session_callbacks.before_frame_send_callback` is
|
* :member:`nghttp2_session_callbacks.before_frame_send_callback` is
|
||||||
* called for this frame.
|
* called for this frame. Other types of frames can be submitted to
|
||||||
|
* the returned stream ID.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int32_t nghttp2_submit_headers(nghttp2_session *session, uint8_t flags,
|
int32_t nghttp2_submit_headers(nghttp2_session *session, uint8_t flags,
|
||||||
|
@ -2538,14 +2542,6 @@ int nghttp2_submit_settings(nghttp2_session *session, uint8_t flags,
|
||||||
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
|
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
|
||||||
* The |stream_id| is 0.
|
* The |stream_id| is 0.
|
||||||
*
|
*
|
||||||
* .. warning::
|
|
||||||
*
|
|
||||||
* This function returns assigned promised stream ID if it succeeds.
|
|
||||||
* But that stream is not opened yet. The application must not
|
|
||||||
* submit frame to that stream ID before
|
|
||||||
* :member:`nghttp2_session_callbacks.before_frame_send_callback` is
|
|
||||||
* called for this frame.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
int32_t nghttp2_submit_push_promise(nghttp2_session *session, uint8_t flags,
|
int32_t nghttp2_submit_push_promise(nghttp2_session *session, uint8_t flags,
|
||||||
int32_t stream_id,
|
int32_t stream_id,
|
||||||
|
|
|
@ -634,11 +634,6 @@ int nghttp2_session_add_frame(nghttp2_session *session,
|
||||||
stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
|
stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
|
||||||
|
|
||||||
switch(frame->hd.type) {
|
switch(frame->hd.type) {
|
||||||
case NGHTTP2_HEADERS:
|
|
||||||
case NGHTTP2_PUSH_PROMISE:
|
|
||||||
item->weight = NGHTTP2_MAX_WEIGHT;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case NGHTTP2_RST_STREAM:
|
case NGHTTP2_RST_STREAM:
|
||||||
if(stream) {
|
if(stream) {
|
||||||
/* We rely on the stream state to decide whether number of
|
/* We rely on the stream state to decide whether number of
|
||||||
|
|
|
@ -4666,25 +4666,12 @@ void test_nghttp2_session_on_ctrl_not_send(void)
|
||||||
CU_ASSERT(0 == nghttp2_session_send(session));
|
CU_ASSERT(0 == nghttp2_session_send(session));
|
||||||
CU_ASSERT(1 == user_data.frame_not_send_cb_called);
|
CU_ASSERT(1 == user_data.frame_not_send_cb_called);
|
||||||
CU_ASSERT(NGHTTP2_HEADERS == user_data.not_sent_frame_type);
|
CU_ASSERT(NGHTTP2_HEADERS == user_data.not_sent_frame_type);
|
||||||
CU_ASSERT(NGHTTP2_ERR_STREAM_CLOSED == user_data.not_sent_error);
|
CU_ASSERT(NGHTTP2_ERR_STREAM_CLOSING == user_data.not_sent_error);
|
||||||
|
|
||||||
stream = nghttp2_session_open_stream(session, 3, NGHTTP2_STREAM_FLAG_NONE,
|
stream = nghttp2_session_open_stream(session, 3, NGHTTP2_STREAM_FLAG_NONE,
|
||||||
&pri_spec_default,
|
&pri_spec_default,
|
||||||
NGHTTP2_STREAM_OPENED, &user_data);
|
NGHTTP2_STREAM_OPENED, &user_data);
|
||||||
|
|
||||||
/* Check HEADERS */
|
|
||||||
user_data.frame_not_send_cb_called = 0;
|
|
||||||
/* Queue RST_STREAM */
|
|
||||||
CU_ASSERT(0 ==
|
|
||||||
nghttp2_submit_headers(session, NGHTTP2_FLAG_END_STREAM, 3,
|
|
||||||
NULL, NULL, 0, NULL));
|
|
||||||
CU_ASSERT(0 == nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, 3,
|
|
||||||
NGHTTP2_INTERNAL_ERROR));
|
|
||||||
CU_ASSERT(0 == nghttp2_session_send(session));
|
|
||||||
CU_ASSERT(1 == user_data.frame_not_send_cb_called);
|
|
||||||
CU_ASSERT(NGHTTP2_HEADERS == user_data.not_sent_frame_type);
|
|
||||||
CU_ASSERT(NGHTTP2_ERR_STREAM_CLOSED == user_data.not_sent_error);
|
|
||||||
|
|
||||||
nghttp2_session_del(session);
|
nghttp2_session_del(session);
|
||||||
|
|
||||||
/* Check request HEADERS */
|
/* Check request HEADERS */
|
||||||
|
|
Loading…
Reference in New Issue