I test nginx’s sub filter, there have some alert log in error log:
the http output chain is empty while sending response to client.
*
*
and i debug nginx , and then found this is cause by sub filter. so i
read
sub filter’s source.
i found when sub_filter_once is on , after text have replaced . and
the
second enter ngx_http_sub_body_filter.
At the moment when in is null,ctx->busy is not null,and so ngx_http_sub_output
may send the rest of buf completely*, therefore in
**ngx_http_next_body_filter
will log alert log : the http output chain is empty while sending
response
to client. *
*
* in conclusion I *think there should add a *judgement that in is
whether
or not NULL.
*
* this is my patch:
*
*
*
— nginx-0.7.67/src/http/modules/ngx_http_sub_filter_module.c
2009-10-26
23:54:29.000000000 +0800
+++ nginx-0.7.67_new/src/http/modules/ngx_http_sub_filter_module.c
2010-09-15
10:14:04.996666685 +0800
@@ -187,16 +187,16 @@ ngx_http_sub_body_filter(ngx_http_reques
}
if (ctx->once && (ctx->buf == NULL || ctx->in == NULL)) {
if (ctx->busy) {
i find this result is cause by postpone filter is removed. because i
use --without-http_ssi_module config nginx. and i read nginx config find
this in auto/modules:
if [ $HTTP_SSI = YES ]; then
HTTP_POSTPONE=YES
fi
if [ $HTTP_ADDITION = YES ]; then
HTTP_POSTPONE=YES
fi
and why postpone is yes when ssi or addition module is on ?
and then i debug nginx find some code in ngx_http_postpone_filter method
:
if (r->postponed == NULL) {
if (in || c->buffered) {
return ngx_http_next_filter(r->main, in);
}
return NGX_OK;
}
therefore if no postpone module, sub filter module may emerge the result
in
my previous email .
On Tue, Sep 21, 2010 at 08:36:11PM +0800, Simon L. wrote:
if (r->postponed == NULL) {
if (in || c->buffered) {
return ngx_http_next_filter(r->main, in);
}
return NGX_OK;
}
this code is needed by subrequest only? i think sub filter is needed too.
It is believed that empty chains shouldn’t appear in output. They
doesn’t make sense unless used to flush various buffers, and
writer rightfully complains when it sees empty chain while there
are no buffered data.
The code in postpone filter obviously hides some of “empty chain”
problems. But it doesn’t mean that sub module needs it. It means
that sub module have to be fixed (and the problem is usually
hidden by postpone filter).
because sub filter module need ngx_http_postpone_filter’s code :
this code is needed by subrequest only? i think sub filter is needed
hidden by postpone filter).
“the http output chain is empty while sending response to client.”
}
problems. But it doesn’t mean that sub module needs it. It means
that sub module have to be fixed (and the problem is usually
hidden by postpone filter).