Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: платная доработк а nginx
On Wed, Jan 28, 2009 at 12:05:15PM +0000, Valery Kholodkov wrote:
>
> "Igor Sysoev" <is@xxxxxxxxxxxxx> wrote:
>
> > On Wed, Jan 28, 2009 at 10:56:51AM +0000, Valery Kholodkov wrote:
> > > Думаю, что нужно завести фазу приема тела запроса, а вместо функции
> > ngx_http_output_filter завести функцию, которая помещает переданные ей
> > буферы в очередь в ngx_http_request_t и отдает NGX_OK.
> >
> > ngx_http_output_filter() только в случае статики передаёт файловый
> > буфер
> > однократно. В случае прокси/fastcgi ngx_http_output_filter()
> > вызывается
> > по мере получения данных от бэкенда.
>
> Проблема не в том, что ngx_http_output_filter() в случае статики передаёт
> файловый буфер однократно, а в том, что SSI-фильтр срабатывает до получения
> тела. Именно поэтому мне в моем патче пришлось перекроить весь static-модуль.
SSI-фильтру не нужно иметь тело запроса. SSI-фильтру нужно просто вызвать
подзапрос, а уже этот подзапрос, если он обрабатывается proxy/fastcgi,
сам прочитает тело.
> > > Фаза приема тела запроса выполнит либо
> > ngx_http_read_client_request_body, либо ngx_http_discard_request_body
> > в зависимости от флага, и в случае ngx_http_read_client_request_body
> > отдаст код
> > >
> > > {
> > > ngx_http_finalize_request(r, ngx_http_output_filter(r,
> > r->queue));
> > > }
> > >
> > > в качестве post_handler. В таком случае все модули на content-фазе
> > подвергнуться минимальным изменениям.
> >
> > В смысле - фаза приёма тела вызывается после контентной ?
>
> Да.
Это сути не отличается от того, что я хотел сделать - откладывать дискард
тела до последнего, если тело не было прочитано. Вопрос лишь в том, когда
собственно можно делать дискард.
> > А как быть с телом для проксирования и прочая ?
>
> Возможны варианты:
>
> 1) Простой: на content-фазе определять, какая фаза будет следующей. Если у
> запроса есть content_handler (который, возможно, унаследовался от локейшена),
> то считать, что content_handler сам принял тело и переходить к log-фазе. Если
> нет, то переходить к фазе обработки тела;
> 2) Генерализованый: сделать код возрата NGX_PROCESS_BODY и в случае получения
> его от любого рода хэндлеров на content-фазе переходить к обработке тела, а
> хэндлер тела записать в запрос.
>
> > Но даже, если вызывать после контента - неизвестно, что в теле -
> > есть SSI или нет.
>
> Это всё равно невозможно определить без чтения содержимого файла. Проще
> передать управление этим администратору.
--
Игорь Сысоев
http://sysoev.ru
|