Re: Буфер в фильтре - как подставить свой?
Maxim Dounin
mdounin at mdounin.ru
Tue Mar 25 18:37:10 UTC 2014
Hello!
On Tue, Mar 25, 2014 at 02:16:29PM -0400, alexserbul wrote:
> Добрый вечер!
>
> Пишу фильтр. Создал буфер (ngx_buf_t), выделив память из аллокатора
> (ngx_pcalloc), установил:
> b->start
> b->pos
> b->last
> b->end
>
> Остальные свойства буфера - нулевые, не трогал.
>
> Пытаюсь заменить приходящий в фильтр в цепочке ngx_chain_t буфер - своим
> буфером. Зависает.
Базовое правило при работе с цепочками буфров: чужую цепочку
(всмысле, структуры ngx_chain_t) трогать нельзя, если нужно что-то
поменять - следует создать свою цепочку (и подцепить к ней нужные
буфера).
Ну и как минимум у буфра должен стоять флаг, определяющий, где
именно располагаются его данные. Если буфер с данными в памяти -
то b->temporary или b->memory, если в файле - то b->file.
> Получилось только в приходящем в цепочке в фильтр буфере установить pos и
> last на выделенную в моем буфере в аллокаторе память, что я понимаю не очень
> красивое решение.
Да, так делать неправильно.
> Таким образом, просто заменить приходящий в фильтр буфер своим - не
> получилось никак.
>
> У структуры буфера (ngx_buf_t) - 21 свойства. Видимо не все буферы можно
> заменять, менять (напр. с свойством "memory"). Где почитать как их учитывать
> в фильтре? Спасибо.
Use The Source, Luke!
Некоторые вещи, впрочем, описаны у Evan'а Miller'а, ссылки есть тут:
http://nginx.org/en/links.html
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru