nginx filters programming

Igor Sysoev is at rambler-co.ru
Fri Dec 23 23:25:44 MSK 2005


On Fri, 23 Dec 2005, Alexey N. Kovyrin wrote:

> Igor Sysoev пишет:
>> On Fri, 23 Dec 2005, Alexey N. Kovyrin wrote:
>> 
>>> Igor Sysoev пишет:
>>>>> 2) Какие подводные камни могут быть при простом добавлении контента вот 
>>>>> в таком виде (да и вообще, правилен ли подход)? :
>>>>> 
>>>>> ngx_chain_t head, tail, *cur;
>>>>> ...
>>>>> head.next = in;
>>>>> ...
>>>>> cur = in;
>>>>> while (cur->next) cur = cur->next;
>>>>> cur->next = &tail;
>>>>> cur->buf->last_buf = 0;
>>>>> tail->buf->last_buf = 1;
>>>>> 
>>>>> return ngx_http_next_body_filter(r, &head);
>>> В таком варианте на пустых html-файлах получается ошибка в логах:
>>> zero size buf in writer t:0 r:0 f:0 00000000 00000000-00000000 080CF3C8 
>>> 0-0 while sending response to client....
>>> 
>>> Как-то я не совсем понимаю, как этого избежать...
>> 
>>  cur->buf->last_buf = 0;
>> +cur->buf->sync = 1;
>>  tail->buf->last_buf = 1;
> Класс! Спасибо - работает! :-) А можно узнать, почему? :-) В чем функция 
> этого sync?

nginx ловит пустые буфера, потому что это, как правило, ошибка в nginx'е.
Кроме буферов данных, могут быть служебные буфера с маркерами last и flush.
Они могут быть пустыми, а могут быть совмещены с данными. При разработке
SSI понадобилось убирать маркер last, но для избежания ситуации zero size buf,
был создан маркер-заглушка sync, поскольку манипуляции с цепочками
не всегда удобны.


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list