<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=koi8-r">
<META content="MSHTML 6.00.2900.3086" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY>
<DIV><FONT face=Arial size=2>1)</FONT></DIV>
<DIV><FONT face=Arial size=2>>> Можно его использовать для чтения
ответа?<BR>>Да.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>А где там данные?</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Первый параметер "ngx_http_request_t* r" их
вроде не содержит,</FONT></DIV>
<DIV><FONT face=Arial size=2>далее "void* data" - это пользовательские данные из
ngx_http_post_subrequest_t:</FONT></DIV>
<DIV><FONT face=Arial size=2>struct ngx_http_post_subrequest_t
{<BR> ngx_http_post_subrequest_pt
handler;<BR> void* data;<BR>};</FONT></DIV>
<DIV><FONT face=Arial size=2>которые присваиваются до вызова
ngx_http_subrequest.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>2) </FONT><FONT face=Arial size=2>Можно ли делать
так (при условии что in->buf->last_buf = 1):</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>static ngx_int_t ngx_http_my_body_filter (
ngx_http_request_t* r, ngx_chain_t* in )<BR>{</FONT></DIV>
<DIV><FONT face=Arial size=2>
ngx_buf_t* b;</FONT></DIV>
<DIV><FONT face=Arial size=2> ........</FONT></DIV>
<DIV><FONT face=Arial size=2> b = ngx_calloc_buf
(r->pool);<BR> if (b == NULL) return
NGX_ERROR;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> b->memory =
1;<BR> b->pos = (u_char*)"<!-- Served
by my module -->";<BR> b->last =
b->pos + sizeof("<!-- Served by my module -->") - 1;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> in->buf = b; //
Заменили буфер, что будет со старым буфером? </FONT></DIV>
<DIV><FONT face=Arial
size=2> //
Будет ли освобожден старый буфер до след. запроса?</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> return ngx_http_next_body_filter
( r, in );</FONT></DIV>
<DIV><FONT face=Arial size=2>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>----- Original Message ----- </FONT>
<DIV><FONT face=Arial size=2>From: "Igor Sysoev" <</FONT><A
href="mailto:is@rambler-co.ru"><FONT face=Arial
size=2>is@rambler-co.ru</FONT></A><FONT face=Arial size=2>></FONT></DIV>
<DIV><FONT face=Arial size=2>To: <</FONT><A
href="mailto:nginx-ru@sysoev.ru"><FONT face=Arial
size=2>nginx-ru@sysoev.ru</FONT></A><FONT face=Arial size=2>></FONT></DIV>
<DIV><FONT face=Arial size=2>Sent: Friday, June 08, 2007 11:55 PM</FONT></DIV>
<DIV><FONT face=Arial size=2>Subject: Re: BugReport: ./configure --add-module
неправильно подключает filter модуль</FONT></DIV></DIV>
<DIV><FONT face=Arial><BR><FONT size=2></FONT></FONT></DIV><FONT face=Arial
size=2>On Fri, Jun 08, 2007 at 11:40:21PM +0400, Denis Erygin wrote:<BR><BR>>
>Что значит - перехватить?<BR>> <BR>> Перехватить, значит прочитать
ответ и исключить его из вывода браузеру.<BR>> В каком месте он добавляется к
результирующему ответу браузеру?<BR><BR>В postpone фильтре. На самом деле, SSI +
вся инфраструктура subrequest по <BR>сложности сравнима со всем nginx'ом. Это не
самая удачная часть,<BR>с которой можно начинатиь писать под
nginx.<BR><BR>Прочитать и исключить ответ можно так, как сделано
в<BR><BR><!--# include virtual="/remote/body.php?argument=value" set="one"
--><BR><BR>> Например, если смотреть ngx_http_addition_filter_module.c ,
то там просто<BR>> вызываются ngx_http_subrequest, а затем в браузере
появляется их вывод,<BR>> хотя явных манипуляций с цепочками буферов
(ngx_chain_t) там нет...<BR>> <BR>> >Этот handler вызывается по
окончании подзапроса.<BR>> Можно его использовать для чтения
ответа?<BR><BR>Да.<BR><BR>> Насчет логики цепочек (ngx_chain_t):<BR>> Если
нужно заменить один из буферов на другой меньшего/большего размера,<BR>> то
как это правильно сделать в стиле nginx? Простая замена указателя на <BR>>
chain->buf->pos<BR>> может привести к утечке памяти.<BR><BR>Если буфер
указывает на другую память, то лучше его создать и
поставить<BR>укзатели.<BR><BR>Замена указателей к утечке не
приводит.<BR><BR><BR>-- <BR>Игорь Сысоев<BR></FONT><A
href="http://sysoev.ru"><FONT face=Arial
size=2>http://sysoev.ru</FONT></A><BR></BODY></HTML>