Mercurial > hg > nginx
changeset 4935:7bd1c839af3b
Request body: improved handling of incorrect chunked request body.
While discarding chunked request body in some cases after detecting
request body corruption no error was returned, while it was possible
to correctly return 400 Bad Request. If error is detected too late,
make sure to properly close connection.
Additionally, in ngx_http_special_response_handler() don't return body
of 500 Internal Server Error to a client if ngx_http_discard_request_body()
fails, but disable keepalive and continue.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 26 Nov 2012 18:00:14 +0000 |
parents | b61edaa04342 |
children | 240e3fb392c9 |
files | src/http/ngx_http_request_body.c src/http/ngx_http_special_response.c |
diffstat | 2 files changed, 16 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/ngx_http_request_body.c Mon Nov 26 17:59:30 2012 +0000 +++ b/src/http/ngx_http_request_body.c Mon Nov 26 18:00:14 2012 +0000 @@ -471,12 +471,18 @@ } } - if (ngx_http_read_discarded_request_body(r) == NGX_OK) { + rc = ngx_http_read_discarded_request_body(r); + + if (rc == NGX_OK) { r->lingering_close = 0; return NGX_OK; } - /* == NGX_AGAIN */ + if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { + return rc; + } + + /* rc == NGX_AGAIN */ r->read_event_handler = ngx_http_discarded_request_body_handler; @@ -533,6 +539,12 @@ return; } + if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { + c->error = 1; + ngx_http_finalize_request(r, NGX_ERROR); + return; + } + /* rc == NGX_AGAIN */ if (ngx_handle_read_event(rev, 0) != NGX_OK) { @@ -606,8 +618,7 @@ rc = ngx_http_discard_request_body_filter(r, &b); if (rc != NGX_OK) { - r->connection->error = 1; - return NGX_OK; + return rc; } } }
--- a/src/http/ngx_http_special_response.c Mon Nov 26 17:59:30 2012 +0000 +++ b/src/http/ngx_http_special_response.c Mon Nov 26 18:00:14 2012 +0000 @@ -421,7 +421,7 @@ r->expect_tested = 1; if (ngx_http_discard_request_body(r) != NGX_OK) { - error = NGX_HTTP_INTERNAL_SERVER_ERROR; + r->keepalive = 0; } if (clcf->msie_refresh