# HG changeset patch # User Valentin Bartenev # Date 1461076729 -10800 # Node ID 9070ba416284cd7adc0ca746e73723396c1ee9c3 # Parent 9ac934dd5dd86b81640d6fdb4ecf5c1cf0c5ff43 HTTP/2: send the output queue after emitting WINDOW_UPDATE. The WINDOW_UPDATE frame could be left in the output queue for an indefinite period of time resulting in the request timeout. This might happen if reading of the body was triggered by an event unrelated to client connection, e.g. by the limit_req timer. diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c --- a/src/http/v2/ngx_http_v2.c +++ b/src/http/v2/ngx_http_v2.c @@ -3414,6 +3414,7 @@ ngx_http_v2_read_request_body(ngx_http_r ngx_http_v2_stream_t *stream; ngx_http_request_body_t *rb; ngx_http_core_loc_conf_t *clcf; + ngx_http_v2_connection_t *h2c; stream = r->stream; @@ -3498,6 +3499,15 @@ ngx_http_v2_read_request_body(ngx_http_r stream->skip_data = 1; return NGX_HTTP_INTERNAL_SERVER_ERROR; } + + h2c = stream->connection; + + if (!h2c->blocked) { + if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) { + stream->skip_data = 1; + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + } } ngx_add_timer(r->connection->read, clcf->client_body_timeout);