diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2014-01-04 03:32:22 +0400 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2014-01-04 03:32:22 +0400 |
commit | 142ed3f499931e7620189906683f7d91ed805e1a (patch) | |
tree | 9a70de617dedfb6a827ddfc83091df1516559b55 | |
parent | ae341c36ab550d245e0741cf94e14890e4b53673 (diff) | |
download | nginx-142ed3f499931e7620189906683f7d91ed805e1a.tar.gz nginx-142ed3f499931e7620189906683f7d91ed805e1a.zip |
Fixed "zero size buf in output" alerts.
If a request had an empty request body (with Content-Length: 0), and there
were preread data available (e.g., due to a pipelined request in the buffer),
the "zero size buf in output" alert might be logged while proxying the
request to an upstream.
Similar alerts appeared with client_body_in_file_only if a request had an
empty request body.
-rw-r--r-- | src/http/ngx_http_request_body.c | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c index 7ca328791..1d8bc4a28 100644 --- a/src/http/ngx_http_request_body.c +++ b/src/http/ngx_http_request_body.c @@ -150,21 +150,27 @@ ngx_http_read_client_request_body(ngx_http_request_t *r, goto done; } - cl = ngx_chain_get_free_buf(r->pool, &rb->free); - if (cl == NULL) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - goto done; - } + if (rb->temp_file->file.offset != 0) { - b = cl->buf; + cl = ngx_chain_get_free_buf(r->pool, &rb->free); + if (cl == NULL) { + rc = NGX_HTTP_INTERNAL_SERVER_ERROR; + goto done; + } - ngx_memzero(b, sizeof(ngx_buf_t)); + b = cl->buf; - b->in_file = 1; - b->file_last = rb->temp_file->file.offset; - b->file = &rb->temp_file->file; + ngx_memzero(b, sizeof(ngx_buf_t)); - rb->bufs = cl; + b->in_file = 1; + b->file_last = rb->temp_file->file.offset; + b->file = &rb->temp_file->file; + + rb->bufs = cl; + + } else { + rb->bufs = NULL; + } } post_handler(r); @@ -375,20 +381,26 @@ ngx_http_do_read_client_request_body(ngx_http_request_t *r) return NGX_HTTP_INTERNAL_SERVER_ERROR; } - cl = ngx_chain_get_free_buf(r->pool, &rb->free); - if (cl == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } + if (rb->temp_file->file.offset != 0) { - b = cl->buf; + cl = ngx_chain_get_free_buf(r->pool, &rb->free); + if (cl == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } - ngx_memzero(b, sizeof(ngx_buf_t)); + b = cl->buf; + + ngx_memzero(b, sizeof(ngx_buf_t)); + + b->in_file = 1; + b->file_last = rb->temp_file->file.offset; + b->file = &rb->temp_file->file; - b->in_file = 1; - b->file_last = rb->temp_file->file.offset; - b->file = &rb->temp_file->file; + rb->bufs = cl; - rb->bufs = cl; + } else { + rb->bufs = NULL; + } } r->read_event_handler = ngx_http_block_reading; @@ -843,6 +855,10 @@ ngx_http_request_body_length_filter(ngx_http_request_t *r, ngx_chain_t *in) for (cl = in; cl; cl = cl->next) { + if (rb->rest == 0) { + break; + } + tl = ngx_chain_get_free_buf(r->pool, &rb->free); if (tl == NULL) { return NGX_HTTP_INTERNAL_SERVER_ERROR; |