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 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
|