Вообще при отладке полезно логирование, а не отладчик
Использую и то и другое.
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@xxxxxxxxxxxxx>
To: <nginx-ru@xxxxxxxxx>
Sent: Friday, June 08, 2007 2:33 PM
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