On Fri, Jun 08, 2007 at 12:22:50PM +0400, Denis Erygin wrote:
> Нужно ли читать буфер своими силами когда
> инициализирован file и in_file = 1 ?
>
> Например в ngx_http_*_body_filter ( ngx_http_request_t* r, ngx_chain_t* in )
> пришло:
>
> in->buf->pos = NULL
> in->buf->last = NULL
> in->buf->start = NULL
> in->buf->end = NULL
> in->buf->in_file = 1
> in->buf->last_buf = 1
> in->buf->last_in_chain = 1
> ...
>
> В таком случае нужно брать дескриптор файла из in->buf->file и из него
> читать?
> Но я такого в готовых фильтрах не нашел.
Если фильтру нужны буфера в памяти, то в header фильтре нужно поставить
r->filter_need_in_memory = 1;
и copy фильтр считает данные из файла.
> Еще насчет контекстов:
>
> static ngx_int_t ngx_http_my_header_filter ( ngx_http_request_t* r )
> {
> ngx_http_my_ctx_t* ctx;
>
> if ( r != r->main ) return ngx_http_next_header_filter (r);
>
> ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_my_ctx_t));
> if (ctx == NULL) return NGX_ERROR;
>
> // Устанавливаем фактически только для r->main
> ngx_http_set_ctx ( r, ctx, ngx_http_my_filter_module);
>
> return ngx_http_next_header_filter (r);
> }
>
> static ngx_int_t ngx_http_tmpl_body_filter ( ngx_http_request_t* r,
> ngx_chain_t* in )
> {
> ngx_http_my_ctx_t* ctx;
> ....
> ctx = ngx_http_get_module_ctx ( r, ngx_http_my_filter_module );
> if ( ctx == NULL )
> <= // Не срабатывает для r != r->main
> return ngx_http_next_body_filter ( r, in );
> ....
> return ngx_http_next_body_filter ( r, in );
> }
>
> В тестах ngx_http_tmpl_body_filter(...) сtx != NULL даже когда r !=
> r->main,
> хотя контекст был установлен только для r->main.
Не должно. Вообще при отладке полезно логирование, а не отладчик.
--
Игорь Сысоев
http://sysoev.ru