В общем, все разрешилось.
Если вставить ngx_http_subrequest в ngx_http_*_body_filter,
то это также приведет к вызову ngx_http_*_body_filter ( r, NULL ),
но с помощью флага в контекте это решается.
По поводу того, как в ssi сделано ожидание ngx_http_subrequest:
Зачем это?
for ( pr = ctx->wait->parent; pr; pr = pr->parent )
{
if ( pr == r )
{
rc = ngx_http_next_body_filter ( r, NULL );
if ( ctx->wait->done ) ctx->wait = NULL;
if ( rc == NGX_ERROR || rc == NGX_AGAIN )
return rc;
}
}
Я так понимаю, это нужно для ожидания нескольких ngx_http_subrequest?
----- Original Message -----
From: "Igor Sysoev" <is@xxxxxxxxxxxxx>
To: <nginx-ru@xxxxxxxxx>
Sent: Monday, July 09, 2007 2:28 PM
Subject: Re: Fw: Баг или фича?
On Mon, Jul 09, 2007 at 01:53:18PM +0400, Denis Erygin wrote:
>Это фильтр или модуль ? Если модуль - как завершается ?
Это фильтр.
>Нужно смотреть на rc == NGX_AGAIN.
NGX_AGAIN вижу, но как правильно отличить в ngx_http_*_body_filter
режим докачки от ее завершения, ngx_chain_t* in == NULL
при NGX_AGAIN ?
Каждая часть ответа проходит через фильтр только один раз.
Завершение ответа - buf->last_buf. После этого in == NULL используется
для прокачки частей ответа, застрявших на разных уровнях фильтров.
Как правило, части застревают на уровне write filter.
rc в общем случае нужно транслировать на верхний уровень..
--
Игорь Сысоев
http://sysoev.ru