Возврат данных из подзапроса
Igor A. Valcov
viaprog на gmail.com
Вт Ноя 2 18:10:02 MSK 2010
Здравствуйте!
Вопрос знатокам внутренностей nginx. Хочу разобраться с сабжевым механизмом.
Пишу модуль, в котором есть такой обработчик запроса
ngx_int_t ngx_http_subrequest_handler(ngx_http_request_t *r)
{
...
ngx_http_post_subrequest_t *sub_cb = ngx_pcalloc(r->pool,
sizeof(ngx_http_post_subrequest_t));
if (sub_cb == NULL)
return NGX_HTTP_INTERNAL_SERVER_ERROR;
sub_cb->handler = subrequest_completed;
sub_cb->data = NULL; /* FIXME */
ngx_str_t uri;
ngx_str_set(&uri, "/fetch");
ngx_http_request_t *req = NULL;
rc = ngx_http_subrequest(r, &uri, NULL, &req, sub_cb,
NGX_HTTP_SUBREQUEST_WAITED);
if (rc != NGX_OK)
return NGX_HTTP_INTERNAL_SERVER_ERROR;
return NGX_AGAIN;
}
Который назначается так:
...
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
clcf->handler = ngx_http_subrequest_handler;
...
Этот подзапрос отправляется на
location /fetch {
internal;
proxy_pass http://host.ru:port;
}
После приёма данных proxy-модулём вызывается обработчик subrequest_completed
ngx_int_t subrequest_completed(ngx_http_request_t *r, void *data, ngx_int_t rc)
{
ngx_buf_t *buf;
ngx_chain_t out;
ngx_buf_t *resp = NULL;
if(r->out)
resp = r->out->buf;
if(r->upstream)
resp = &r->upstream->buffer;
....
// ngx_http_request_t *pr = r->parent;
// pr->write_event_handler = write_event_handler;
return NGX_OK;
}
Вопрос такой: как идеологически правильным способом получить и
обработать данные подзапроса на уровне родительского запроса? Откуда
это делать? И как правильно завершить подзапрос и родитиельский
запрос?
Кратко, задача такая: нужно изъять полученные mod_proxy данные (и
заголовки), которые он пытается отправить в out, на основе этих данных
сгенерировать совершенно другие данные (и заголовки) и отправиь в out
уже их.
Спасибо.
--
Igor A. Valcov
Подробная информация о списке рассылки nginx-ru