Mercurial > hg > nginx
changeset 6520:9070ba416284
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.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Tue, 19 Apr 2016 17:38:49 +0300 |
parents | 9ac934dd5dd8 |
children | 13070ecfda67 |
files | src/http/v2/ngx_http_v2.c |
diffstat | 1 files changed, 10 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/v2/ngx_http_v2.c Tue Apr 19 17:38:49 2016 +0300 +++ b/src/http/v2/ngx_http_v2.c Tue Apr 19 17:38:49 2016 +0300 @@ -3414,6 +3414,7 @@ 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 @@ 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);