Re: Баг или фича?

Denis Erygin erygin at corp.mail.ru
Mon Jul 9 18:56:35 MSD 2007


В общем, все разрешилось.

Если вставить 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 at rambler-co.ru>
To: <nginx-ru at sysoev.ru>
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






More information about the nginx-ru mailing list