Re: zero size ошибка при добавлении текста в body filter
Maxim Dounin
mdounin на mdounin.ru
Вт Фев 7 13:58:00 UTC 2012
Hello!
On Tue, Feb 07, 2012 at 05:34:01PM +0400, Валентин Бартенев wrote:
> On Tuesday 07 February 2012 04:38:03 mishalunin wrote:
> > Здравствуйте. Пробую писать свой
> > модуль для nginx и столкнулся со
> > следующей проблемой:
> > в body фильтре своего модуля добавляю
> > новый буфер в конец цепочки:
> >
> > /*тут ищется последний chain link*/
> > ngx_buf_t *b;
> > b = ngx_calloc_buf(r->pool);
> >
> > b->pos = (u_char *)IF_CODE;
> > b->last = b->pos + sizeof(IF_CODE) - 1;
> > b->memory = 1;
> >
> > ngx_chain_t *new_link;
> > new_link = ngx_alloc_chain_link(r->pool);
> >
> > new_link->buf = b;
> > new_link->next = NULL;
> >
> > chain_link->next = new_link;
> >
> > chain_link->buf->last_buf = 0;
> > chain_link->buf->sync = 1;
> > new_link->buf->last_buf = 1;
> >
> > return ngx_http_next_body_filter(r, in);
> >
> > в итоге браузеру не отдается ничего, а в
> > логах следующее:
> > 2012/02/06 15:52:51 [debug] 8424#0: *3 write old buf t:1 f:0
> > 08D15D44, pos 08D15D44, size: 217 file: 0, size: 0, last: 0 (headers)
> > 2012/02/06 15:52:51 [debug] 8424#0: *3 write new buf t:0 f:1
> > 00000000, pos 00000000, size: 0 file: 0, size: 6506, last: 0 (html
> > file)
> > 2012/02/06 15:52:51 [debug] 8424#0: *3 write new buf t:0 f:1 (???)
> > 00000000, pos 080BE1B6, size: 22 file: 0, size: 0, last: 0 (my text)
> > 2012/02/06 15:52:51 [alert] 8424#0: *3 zero size buf in writer t:0
> > r:0 f:1 00000000 080BE1B6-080BE1CC 00000092 0-0 while sending response
> > to client, client: 127.0.0.1, server: localhost, request: "GET
> > /license.html HTTP/1.1", host: "127.0.0.1
> >
> > полазив отладчиком, обнаружил, что
> > данные в цепочке мистическим образом
> > меняются сразу после передачи ее
> > следующему фильтру:
> >
> > (gdb)
> > 164 return ngx_http_next_body_filter(r, in);
> > (gdb) p *(in->next->buf)
> > $15 = {pos = 0x80be1b6 "<h1>INSERTED CODE</h1>", last = 0x80be1cc "",
> > file_pos = 0, file_last = 0, start = 0x0, end = 0x0, tag = 0x0,
> > file = 0x0, shadow = 0x0, temporary = 0, memory = 1, mmap = 0,
> > recycled = 0, in_file = 0, flush = 0, sync = 0, last_buf = 1,
> > last_in_chain = 0, last_shadow = 0, temp_file = 0, num = 0}
> > (gdb) step
> > ngx_http_charset_body_filter (r=0x9ae5048, in=0xbf861fe4)
> > at src/http/modules/ngx_http_charset_filter_module.c:544
> > 544 {
> > (gdb) p *(in->next->buf)
> > $16 = {pos = 0x80be1b6 "<h1>INSERTED CODE</h1>", last = 0x80be1cc "",
> > file_pos = 0, file_last = 0, start = 0x0, end = 0x0, tag = 0x0,
> > file = 0x82, shadow = 0x0, temporary = 0, memory = 0, mmap = 0,
> > recycled = 0, in_file = 1, flush = 1, sync = 1, last_buf = 0,
> > last_in_chain = 0, last_shadow = 1, temp_file = 1, num = 0}
> >
> > например, меняется флаг memory из-за
> > которого и вызывается эта ошибка. Что я
> > делаю не так? Спасибо :)
> >
>
> ОС какая? Архитектура? #include <ngx_config.h> стоит первым?
Just to make things more clear:
Валентин справедливо предположил, что операционная система -
линукс, и #include <ngx_config.h> в модуле не стоит или стоит не
первым. В результате тип off_t в рамках вашего модуля 32-битный,
а не 64-битный, как в остальном nginx'е, что и приводит к
наблюдаемым эффектам.
Нужно всегда указывать #include <ngx_config.h> первым, и никак
иначе.
Maxim Dounin
Подробная информация о списке рассылки nginx-ru