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.
This commit is contained in:
Maxim Dounin 2012-11-21 00:55:06 +00:00
parent ab5ac3b095
commit 743922a2ce

View File

@ -1767,7 +1767,7 @@ ngx_http_variable_request_body(ngx_http_request_t *r,
{ {
u_char *p; u_char *p;
size_t len; size_t len;
ngx_buf_t *buf, *next; ngx_buf_t *buf;
ngx_chain_t *cl; ngx_chain_t *cl;
if (r->request_body == NULL if (r->request_body == NULL
@ -1792,8 +1792,13 @@ ngx_http_variable_request_body(ngx_http_request_t *r,
return NGX_OK; return NGX_OK;
} }
next = cl->next->buf; len = buf->last - buf->pos;
len = (buf->last - buf->pos) + (next->last - next->pos); cl = cl->next;
for ( /* void */ ; cl; cl = cl->next) {
buf = cl->buf;
len += buf->last - buf->pos;
}
p = ngx_pnalloc(r->pool, len); p = ngx_pnalloc(r->pool, len);
if (p == NULL) { if (p == NULL) {
@ -1801,9 +1806,12 @@ ngx_http_variable_request_body(ngx_http_request_t *r,
} }
v->data = p; v->data = p;
cl = r->request_body->bufs;
p = ngx_cpymem(p, buf->pos, buf->last - buf->pos); for ( /* void */ ; cl; cl = cl->next) {
ngx_memcpy(p, next->pos, next->last - next->pos); buf = cl->buf;
p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);
}
v->len = len; v->len = len;
v->valid = 1; v->valid = 1;