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