ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


  • To: nginx-ru@xxxxxxxxx
  • Subject: Возврат данных из подзапр оса
  • From: "Igor A. Valcov" <viaprog@xxxxxxxxx>
  • Date: Tue, 2 Nov 2010 18:10:02 +0300
  • Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type:content-transfer-encoding; bh=M7t9TzLxvOFjzeQqTunf6fPcatV+u2nA33jkBz9FEuI=; b=aBgqZLgTfaoVaPTJhRTkcjqPDr4hlLFhuqNle0rYuQ9LGS14XIIkgz2IZLuyompcUe GQcpnHwMKqFOyd/QJ1XNo4oj2kLgHjpwoPCBYizsdMNWCfcijU+ZQUORMOhmbouXMxDn IV7sK0jCnOgOChcSBsT+DyQrMlkohWS76sqy0=
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type :content-transfer-encoding; b=Etsipqa1Ky+6Kf0uVQ3d92ffC/ta3JOVxpNMUiW+J9b70dmSFrgiJLCHLkjg3eyBc9 TFp1vfwJMCboKmR5KOyf+YdpKm9IM4jwMyqRYCx220K0cPhC0rOQsE55axvekLGOSS2E idcv6F53/69P18yx0BejElUT+u9ymJ6ne2obo=

Здравствуйте!

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


 




Copyright © Lexa Software, 1996-2009.