Re: BugReport: ./configure --add-module неправильно подключает filter модуль

Denis Erygin erygin at corp.mail.ru
Fri Jun 8 15:24:13 MSD 2007


Общая картина существенно прояснилась, но остались вопросы по
ngx_http_subrequest ( ngx_http_request_t* r,  ngx_str_t*uri, ngx_str_t* 
args, ngx_http_request_t **sr,
                                  ngx_http_post_subrequest_t* psr, 
ngx_uint_t flags )

>Вообще при отладке полезно логирование, а не отладчик
Использую и то и другое.

struct ngx_http_post_subrequest_t {
    ngx_http_post_subrequest_pt       handler;
    void* data;
};

Что делает этот handler если его установить и передать внутри
структуры ngx_http_post_subrequest_t (psr) в ngx_http_subrequest?

И главный вопрос: где можно перехватить буфер ответа ngx_http_subrequest,
если мой фильтр установлен на location отличный от переданного в
ngx_http_subrequest, например "/my_filter", а запрос на 
"/for_http_subrequests"?

В этом случае ngx_http_my_body_filter() вызывается всего один раз,
так как привязан к location "/my_filter".

Да, браузер получает смешанный результат, но где он смешивается неясно,
по крайней мере дамп ngx_chain_t в конце (после sub_http_request) 
ngx_http_my_body_filter()
его не содержит.

----- Original Message ----- 
From: "Igor Sysoev" <is at rambler-co.ru>
To: <nginx-ru at sysoev.ru>
Sent: Friday, June 08, 2007 2:33 PM
Subject: Re: BugReport: ./configure --add-module неправильно подключает 
filter модуль


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






More information about the nginx-ru mailing list