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:
parent
fa074145a4
commit
54f4b85beb
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue