[nginx] Addition filter: set last_in_chain flag when clearing last_buf.

Maxim Dounin mdounin at mdounin.ru
Tue Jan 31 13:40:49 UTC 2017

details:   http://hg.nginx.org/nginx/rev/17000e3ba589
branches:  stable-1.10
changeset: 6887:17000e3ba589
user:      Roman Arutyunyan <arut at nginx.com>
date:      Mon Oct 03 21:03:27 2016 +0300
Addition filter: set last_in_chain flag when clearing last_buf.

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 |  1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diffs (11 lines):

diff --git a/src/http/modules/ngx_http_addition_filter_module.c b/src/http/modules/ngx_http_addition_filter_module.c
--- a/src/http/modules/ngx_http_addition_filter_module.c
+++ b/src/http/modules/ngx_http_addition_filter_module.c
@@ -171,6 +171,7 @@ ngx_http_addition_body_filter(ngx_http_r
     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;

More information about the nginx-devel mailing list