[nginx] svn commit: r5182 - trunk/src/http/modules/perl
mdounin at mdounin.ru
mdounin at mdounin.ru
Tue Apr 23 10:04:13 UTC 2013
Author: mdounin
Date: 2013-04-23 10:04:12 +0000 (Tue, 23 Apr 2013)
New Revision: 5182
URL: http://trac.nginx.org/nginx/changeset/5182/nginx
Log:
Perl: request body handling fixed.
As of 1.3.9, chunked request body may be available with
r->headers_in.content_length_n <= 0. Additionally, request body
may be in multiple buffers even if r->request_body_in_single_buf
was requested.
Modified:
trunk/src/http/modules/perl/nginx.xs
Modified: trunk/src/http/modules/perl/nginx.xs
===================================================================
--- trunk/src/http/modules/perl/nginx.xs 2013-04-19 12:19:57 UTC (rev 5181)
+++ trunk/src/http/modules/perl/nginx.xs 2013-04-23 10:04:12 UTC (rev 5182)
@@ -357,7 +357,7 @@
ngx_http_perl_set_request(r);
- if (r->headers_in.content_length_n <= 0) {
+ if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) {
XSRETURN_UNDEF;
}
@@ -386,7 +386,10 @@
dXSTARG;
ngx_http_request_t *r;
+ u_char *p, *data;
size_t len;
+ ngx_buf_t *buf;
+ ngx_chain_t *cl;
ngx_http_perl_set_request(r);
@@ -397,13 +400,43 @@
XSRETURN_UNDEF;
}
- len = r->request_body->bufs->buf->last - r->request_body->bufs->buf->pos;
+ cl = r->request_body->bufs;
+ buf = cl->buf;
+ if (cl->next == NULL) {
+ len = buf->last - buf->pos;
+ data = buf->pos;
+ goto done;
+ }
+
+ 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) {
+ return XSRETURN_UNDEF;
+ }
+
+ data = p;
+ cl = r->request_body->bufs;
+
+ for ( /* void */ ; cl; cl = cl->next) {
+ buf = cl->buf;
+ p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);
+ }
+
+ done:
+
if (len == 0) {
XSRETURN_UNDEF;
}
- ngx_http_perl_set_targ(r->request_body->bufs->buf->pos, len);
+ ngx_http_perl_set_targ(data, len);
ST(0) = TARG;
More information about the nginx-devel
mailing list