HTTP/2: don't send WINDOW_UPDATE for an empty request body.

Particularly this prevents sending WINDOW_UPDATE with zero delta
which can result in PROTOCOL_ERROR.

Also removed surplus setting of no_flow_control to 0.
This commit is contained in:
Valentin Bartenev 2016-04-19 17:38:49 +03:00
parent eeb72127cf
commit f4df08b19d

View File

@ -3481,20 +3481,21 @@ ngx_http_v2_read_request_body(ngx_http_request_t *r,
return ngx_http_v2_process_request_body(r, NULL, 0, 1); return ngx_http_v2_process_request_body(r, NULL, 0, 1);
} }
if (r->request_body_no_buffering) { if (len) {
stream->no_flow_control = 0; if (r->request_body_no_buffering) {
stream->recv_window = (size_t) len; stream->recv_window = (size_t) len;
} else { } else {
stream->no_flow_control = 1; stream->no_flow_control = 1;
stream->recv_window = NGX_HTTP_V2_MAX_WINDOW; stream->recv_window = NGX_HTTP_V2_MAX_WINDOW;
} }
if (ngx_http_v2_send_window_update(stream->connection, stream->node->id, if (ngx_http_v2_send_window_update(stream->connection, stream->node->id,
stream->recv_window) stream->recv_window)
== NGX_ERROR) == NGX_ERROR)
{ {
return NGX_HTTP_INTERNAL_SERVER_ERROR; return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
} }
ngx_add_timer(r->connection->read, clcf->client_body_timeout); ngx_add_timer(r->connection->read, clcf->client_body_timeout);