ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: фильтр



Hello!

On Sun, Mar 30, 2008 at 05:44:53AM +0400, Maxim Dounin wrote:

Hello!

On Sun, Mar 30, 2008 at 03:03:29AM +0200, Alexander Dolgarev wrote:

В чем принципиальная неправильность следующего фрагмента кода (если
допустить что in != NULL и in->next == NULL)? Клиент просто ждет и
ничего не получает в ответ.


static ngx_int_t
ngx_http_*_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
   ngx_chain_t *out;
   ngx_buf_t *b;

   out = ngx_pcalloc(r->pool, sizeof(ngx_chain_t));
   b = ngx_create_temp_buf(r->pool, in->buf->last - in->buf->pos);
   memcpy (b->pos, in->buf->pos, in->buf->last - in->buf->pos);
   b->last_buf = in->buf->last_buf;
   out->buf = b;

   return ngx_http_next_body_filter(r, out);
}

Старый буфер помечен как отправленный, соответственно если ответ будет

s/помечен/не помечен/

Maxim Dounin

более чем output_buffers - его не отошлют.  Как минимум надо ещё сделать:

    in->buf->pos = in->buf->last;

Плюс к тому - никто не обещал, что буфер будет в памяти. Чтобы он таки там был - об этом надо специально попросить, поставив в ngx_http_*_header_filter()

    r->filter_need_in_memory = 1;

Maxim Dounin




 




Copyright © Lexa Software, 1996-2009.