Use largest valid stream ID which passed to callback as last-stream-ID

Previously we use largest stream ID received so far as last-stream-ID,
and it is irrevant that it is passed to the callback (thus upper layer).
Now the stream ID which is passed to callback is eligible to
last-stream-ID.
This commit is contained in:
Tatsuhiro Tsujikawa 2013-11-28 23:26:34 +09:00
parent 40a666e7d1
commit d0d0009a50
3 changed files with 12 additions and 6 deletions

View File

@ -190,8 +190,8 @@ static int nghttp2_session_new(nghttp2_session **session_ptr,
}
memset(*session_ptr, 0, sizeof(nghttp2_session));
/* next_stream_id and last_recv_stream_id are initialized in either
nghttp2_session_client_new or nghttp2_session_server_new */
/* next_stream_id is initialized in either
nghttp2_session_client_new2 or nghttp2_session_server_new2 */
(*session_ptr)->next_seq = 0;
@ -325,7 +325,6 @@ int nghttp2_session_client_new2(nghttp2_session **session_ptr,
if(r == 0) {
/* IDs for use in client */
(*session_ptr)->next_stream_id = 1;
(*session_ptr)->last_recv_stream_id = 0;
}
return r;
}
@ -351,7 +350,6 @@ int nghttp2_session_server_new2(nghttp2_session **session_ptr,
if(r == 0) {
/* IDs for use in client */
(*session_ptr)->next_stream_id = 2;
(*session_ptr)->last_recv_stream_id = 0;
}
return r;
}
@ -1919,6 +1917,7 @@ int nghttp2_session_on_request_headers_received(nghttp2_session *session,
if(!stream) {
return NGHTTP2_ERR_NOMEM;
}
session->last_proc_stream_id = session->last_recv_stream_id;
rv = nghttp2_session_call_on_frame_received(session, frame);
if(rv != 0) {
return rv;
@ -2588,6 +2587,7 @@ int nghttp2_session_on_push_promise_received(nghttp2_session *session,
if(!promised_stream) {
return NGHTTP2_ERR_NOMEM;
}
session->last_proc_stream_id = session->last_recv_stream_id;
return nghttp2_session_call_on_frame_received(session, frame);
}
@ -3723,6 +3723,7 @@ int nghttp2_session_upgrade(nghttp2_session *session,
if(session->server) {
nghttp2_stream_shutdown(stream, NGHTTP2_SHUT_RD);
session->last_recv_stream_id = 1;
session->last_proc_stream_id = 1;
} else {
nghttp2_stream_shutdown(stream, NGHTTP2_SHUT_WR);
session->next_stream_id += 2;

View File

@ -118,7 +118,12 @@ struct nghttp2_session {
uint8_t server;
/* Next Stream ID. Made unsigned int to detect >= (1 << 31). */
uint32_t next_stream_id;
/* The largest stream ID received so far */
int32_t last_recv_stream_id;
/* The largest stream ID which has been processed in some way. This
value will be used as last-stream-id when sending GOAWAY
frame. */
int32_t last_proc_stream_id;
/* Counter of unique ID of PING. Wraps when it exceeds
NGHTTP2_MAX_UNIQUE_ID */
uint32_t next_unique_id;
@ -156,7 +161,7 @@ struct nghttp2_session {
/* Flags indicating GOAWAY is sent and/or recieved. The flags are
composed by bitwise OR-ing nghttp2_goaway_flag. */
uint8_t goaway_flags;
/* This is the value in GOAWAY frame sent by remote endpoint. */
/* This is the value in GOAWAY frame received from remote endpoint. */
int32_t last_stream_id;
/* Non-zero indicates connection-level flow control on remote side

View File

@ -202,7 +202,7 @@ int nghttp2_submit_goaway(nghttp2_session *session, uint8_t flags,
nghttp2_error_code error_code,
uint8_t *opaque_data, size_t opaque_data_len)
{
return nghttp2_session_add_goaway(session, session->last_recv_stream_id,
return nghttp2_session_add_goaway(session, session->last_stream_id,
error_code, opaque_data, opaque_data_len);
}