Welcome! Log In Create A New Profile

Advanced

Возврат данных из подзапроса

Igor A. Valcov
November 02, 2010 11:12AM
Здравствуйте!

Вопрос знатокам внутренностей 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 mailing list
nginx-ru@nginx.org
http://nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

Возврат данных из подзапроса

Igor A. Valcov November 02, 2010 11:12AM

Re: Возврат данных из подзапроса

Maxim Dounin November 02, 2010 12:44PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 74
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready