Fix nghttp2_session_want_write

This commit fixes the bug in nghttp2_session_want_write.  Previously,
it may return 0 if there is pending frames after GOAWAY frame is
submitted.

To avoid the situation that nghttp2_session_want_write keeps returning
nonzero after GOAWAY and the number of active streams is 0 (e.g., keep
receiving SETTINGS or PING), nghttp2_session_mem_recv now just
swallows the input data without parsing in this case.
This commit is contained in:
Tatsuhiro Tsujikawa 2017-03-07 22:55:39 +09:00
parent fa074145a4
commit 54f4b85beb
1 changed files with 10 additions and 15 deletions

View File

@ -5289,6 +5289,10 @@ ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in,
return rv; return rv;
} }
if (!nghttp2_session_want_read(session)) {
return (ssize_t)inlen;
}
for (;;) { for (;;) {
switch (iframe->state) { switch (iframe->state) {
case NGHTTP2_IB_READ_CLIENT_MAGIC: case NGHTTP2_IB_READ_CLIENT_MAGIC:
@ -6609,21 +6613,12 @@ int nghttp2_session_want_write(nghttp2_session *session) {
* response HEADERS and concurrent stream limit is reached, we don't * response HEADERS and concurrent stream limit is reached, we don't
* want to write them. * want to write them.
*/ */
return session->aob.item || nghttp2_outbound_queue_top(&session->ob_urgent) ||
if (session->aob.item == NULL && nghttp2_outbound_queue_top(&session->ob_reg) ||
nghttp2_outbound_queue_top(&session->ob_urgent) == NULL && (!nghttp2_pq_empty(&session->root.obq) &&
nghttp2_outbound_queue_top(&session->ob_reg) == NULL && session->remote_window_size > 0) ||
(nghttp2_pq_empty(&session->root.obq) || (nghttp2_outbound_queue_top(&session->ob_syn) &&
session->remote_window_size == 0) && !session_is_outgoing_concurrent_streams_max(session));
(nghttp2_outbound_queue_top(&session->ob_syn) == NULL ||
session_is_outgoing_concurrent_streams_max(session))) {
return 0;
}
/* If there is no active streams and GOAWAY has been sent or
received, we are done with this session. */
return (session->goaway_flags &
(NGHTTP2_GOAWAY_SENT | NGHTTP2_GOAWAY_RECV)) == 0;
} }
int nghttp2_session_add_ping(nghttp2_session *session, uint8_t flags, int nghttp2_session_add_ping(nghttp2_session *session, uint8_t flags,