]> git.kaiwu.me - nginx.git/commitdiff
HTTP/2: send the output queue after emitting WINDOW_UPDATE.
authorValentin Bartenev <vbart@nginx.com>
Tue, 19 Apr 2016 14:38:49 +0000 (17:38 +0300)
committerValentin Bartenev <vbart@nginx.com>
Tue, 19 Apr 2016 14:38:49 +0000 (17:38 +0300)
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.

src/http/v2/ngx_http_v2.c

index dd712c121e087dc7aa9da9f1defe9201bccf89e0..278c9abf68fd1fb19e382852b40b0a4671ac19e0 100644 (file)
@@ -3414,6 +3414,7 @@ ngx_http_v2_read_request_body(ngx_http_request_t *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_request_t *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);