diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2012-11-21 00:55:06 +0000 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2012-11-21 00:55:06 +0000 |
commit | 743922a2ce266492a7ca034973d70c35ad7919e3 (patch) | |
tree | 1f779db90cef20c421ebaa77b18b43fc2d4cca25 /src/http/ngx_http_variables.c | |
parent | ab5ac3b095acc5051a7e8088a301afd9704fc6fd (diff) | |
download | nginx-743922a2ce266492a7ca034973d70c35ad7919e3.tar.gz nginx-743922a2ce266492a7ca034973d70c35ad7919e3.zip |
Request body: $request_body variable generalization.
The $request_body variable was assuming there can't be more than two
buffers. While this is currently true due to request body reading
implementation details, this is not a good thing to depend on and may
change in the future.
Diffstat (limited to 'src/http/ngx_http_variables.c')
-rw-r--r-- | src/http/ngx_http_variables.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c index 457476842..298064a81 100644 --- a/src/http/ngx_http_variables.c +++ b/src/http/ngx_http_variables.c @@ -1767,7 +1767,7 @@ ngx_http_variable_request_body(ngx_http_request_t *r, { u_char *p; size_t len; - ngx_buf_t *buf, *next; + ngx_buf_t *buf; ngx_chain_t *cl; if (r->request_body == NULL @@ -1792,8 +1792,13 @@ ngx_http_variable_request_body(ngx_http_request_t *r, return NGX_OK; } - next = cl->next->buf; - len = (buf->last - buf->pos) + (next->last - next->pos); + len = buf->last - buf->pos; + cl = cl->next; + + for ( /* void */ ; cl; cl = cl->next) { + buf = cl->buf; + len += buf->last - buf->pos; + } p = ngx_pnalloc(r->pool, len); if (p == NULL) { @@ -1801,9 +1806,12 @@ ngx_http_variable_request_body(ngx_http_request_t *r, } v->data = p; + cl = r->request_body->bufs; - p = ngx_cpymem(p, buf->pos, buf->last - buf->pos); - ngx_memcpy(p, next->pos, next->last - next->pos); + for ( /* void */ ; cl; cl = cl->next) { + buf = cl->buf; + p = ngx_cpymem(p, buf->pos, buf->last - buf->pos); + } v->len = len; v->valid = 1; |