фильтр

Maxim Dounin mdounin at mdounin.ru
Sun Mar 30 05:44:53 MSD 2008


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);
>}

Старый буфер помечен как отправленный, соответственно если ответ 
будет более чем output_buffers - его не отошлют.  Как минимум надо 
ещё сделать:

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

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

     r->filter_need_in_memory = 1;

Maxim Dounin





More information about the nginx-ru mailing list