]> git.kaiwu.me - nginx.git/commitdiff
Proxy: fixed proxy_request_buffering and chunked with preread body.
authorMaxim Dounin <mdounin@mdounin.ru>
Wed, 25 Mar 2015 23:31:30 +0000 (02:31 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Wed, 25 Mar 2015 23:31:30 +0000 (02:31 +0300)
If any preread body bytes were sent in the first chain, chunk size was
incorrectly added before the whole chain, including header, resulting in
an invalid request sent to upstream.  Fixed to properly add chunk size
after the header.

src/http/modules/ngx_http_proxy_module.c

index d0b1c885d2cbb136669f592b986910c891072993..00e8923a0091d7607c1ab9b3367428ee90fe5c46 100644 (file)
@@ -1503,7 +1503,7 @@ ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in)
     u_char                *chunk;
     ngx_int_t              rc;
     ngx_buf_t             *b;
-    ngx_chain_t           *out, *cl, *tl, **ll;
+    ngx_chain_t           *out, *cl, *tl, **ll, **fl;
     ngx_http_proxy_ctx_t  *ctx;
 
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
@@ -1546,6 +1546,7 @@ ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in)
 
     size = 0;
     cl = in;
+    fl = ll;
 
     for ( ;; ) {
         ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
@@ -1602,8 +1603,8 @@ ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in)
         b->pos = chunk;
         b->last = ngx_sprintf(chunk, "%xO" CRLF, size);
 
-        tl->next = out;
-        out = tl;
+        tl->next = *fl;
+        *fl = tl;
     }
 
     if (cl->buf->last_buf) {