Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: фильтр
- To: nginx-ru@xxxxxxxxx
- Subject: Re: фильтр
- From: "Alexander Dolgarev" <a.dolgarev@xxxxxxxxx>
- Date: Mon, 31 Mar 2008 13:08:10 +0300
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; bh=q//LJIik6Jl0TP5VyYdsJQw37ZFymuzzTyhnjYpqCng=; b=NYY++Q4X2xqsz3GfRLaNEBwwogkvHopQZPmxFDai96XL9N3e7Z7Ea+1BvMVvegG1KIxZJQM4J0DWyADYkIEz9ExHvqLYt4hjZurJDPTfJM/sR3ro7OLrmnlW2Eflp3hXsmd8P6RIEvbjXx0hCQkq2R1Fw6GstXwIgbyfAXj+sEg=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=message-id:date:from:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=WfU0tJLNAOocN0Qhsw6BhJKs8IqzqhEJJ8jGlG1EI5ckqX8MbRjwP+CRfAoBccJlh5te0oeZnk5pNNZ+A9IJRtxqdYgk0L5Qm4PdTcLzndwwzVrHMqMHUaeEM7j+upszF/OhAjVWaF+F1BtqFERBMgwJJnze3724QnjcFGXLjVY=
- In-reply-to: <20080330014453.GD73485@xxxxxxxxxx>
- References: <fb7e57860803291803m4e57628ag3d03276cb7d8ac0f@xxxxxxxxxxxxxx> <20080330014453.GD73485@xxxxxxxxxx>
Задача очень проста: заменить на лету содержимое, допустим букву A на
2 буквы AA. Мне нужно взять цепочку in и заменить ее на новую цепочку
out, которая содержит новые буфера с измененным содержимым (выходных
буферов будет скорее всего больше чем входных, так как объем данных
увеличится).
Отсюда вытекает пара вопросов.
1. Могу ли я создавать свои цепочки путем
out = ngx_pcalloc(r->pool, sizeof(ngx_chain_t));
и далее вызывать
return ngx_http_next_body_filter(r, out);
или мне обязательно передавать в ngx_http_next_body_filter цепочку in,
заменив в ней буфер на свой?
2. Буфер создается путем
b = ngx_create_temp_buf(r->pool, BUFLEN);
Какие еще флаги надо в нем выставлять кроме тех, что выставляются
функцией ngx_create_temp_buf()?
3. Что нужно делать с буферами в цепочке in? Ниже высказывалось
мнение, что пометить его как отправленный (in->buf->pos =
in->buf->last), что-то еще нужно?
2008/3/30 Maxim Dounin <mdounin@xxxxxxxxxx>:
> 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
>
>
|