]> git.kaiwu.me - nginx.git/commitdiff
Addition filter: set last_in_chain flag when clearing last_buf.
authorRoman Arutyunyan <arut@nginx.com>
Mon, 3 Oct 2016 18:03:27 +0000 (21:03 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Mon, 3 Oct 2016 18:03:27 +0000 (21:03 +0300)
When the last_buf flag is cleared for add_after_body to append more data from a
subrequest, other filters may still have buffered data, which should be flushed
at this point.  For example, the sub_filter may have a partial match buffered,
which will only be flushed after the subrequest is done, ending up with
interleaved data in output.

Setting last_in_chain instead of last_buf flushes the data and fixes the order
of output buffers.

src/http/modules/ngx_http_addition_filter_module.c

index db4970bf1d633732d0f2c4647df96b3a956789ca..2fad0e59bf92a74583215aa8c11c4283633aa59a 100644 (file)
@@ -171,6 +171,7 @@ ngx_http_addition_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
     for (cl = in; cl; cl = cl->next) {
         if (cl->buf->last_buf) {
             cl->buf->last_buf = 0;
+            cl->buf->last_in_chain = 1;
             cl->buf->sync = 1;
             last = 1;
         }