<div dir="ltr"><div dir="ltr">Hello Maxim,<br><br>On your last suggestion...<div><br></div><div>"In the request body filter you have to either return a fatal  error, or raise some internal flag for your processing, and then </div>act on this flag after the body is fully read."</div><div><br></div><div>How can I be certain when my body is fully read? Currently, when my body filter is invoked,</div><div>I am walking the chain of buffers and saving it to a temporary buffer to perform my lookup.</div><div>That is why I am little confused by your statement.Thanks for all your help.</div><div dir="ltr"><br></div><div>regards,</div><div>dk</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Sep 11, 2018 at 5:55 AM Maxim Dounin <<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<br>
On Mon, Sep 10, 2018 at 10:58:29PM -0700, Dk Jack wrote:<br>
<br>
> Hi,<br>
> In my module, I am trying to forward the request to my server based on the<br>
> content of the request body. To acheive this, I've added a body capture<br>
> filter to capture the body. My code is something like this...<br>
> <br>
> static ngx_int_t<br>
> nginx_inspect_body_filter(ngx_http_request_t *r, ngx_chain_t *in)<br>
> {<br>
> <br>
>     ... // extract body<br>
>     if (if_content_of_interest_in_body(body, body_length)) {<br>
>         ngx_str_t uri = ngx_string("/my_location");<br>
>         ngx_http_internal_redirect(r, &url, NULL);<br>
>         ngx_http_finalize_request(r, NGX_DONE);<br>
>         return NGX_DONE;<br>
>     }<br>
>     ...<br>
> }<br>
> <br>
> I have the following conf for '/my_location':<br>
> <br>
>   server {<br>
>      ...<br>
>      location / {<br>
>          ...<br>
>      }<br>
>      location /my_location {<br>
>          proxy_pass <a href="http://myserver" rel="noreferrer" target="_blank">http://myserver</a>;<br>
>      }<br>
>    }<br>
> <br>
> However, I am running into an issue with my code. The request seems to get<br>
> forwarded to my server like I expected. However, my connection seems to<br>
> hang. Looks like the server seems to be waiting to read more data from<br>
> nginx. When I interrupt my server (ctrl-c; its a simple python server), it<br>
> sort breaks out of the read loop and a response is returned. Sending the<br>
> same request to my server without sending it through my module in nginx,<br>
> behaves correctly.<br>
> <br>
> Could someone more experienced in nginx, point out what I am doing wrong?<br>
> Is redirect allowed from a body filter handler? Thanks for your help in<br>
> advance.<br>
<br>
Assuming the "nginx_inspect_body_filter" function is installed <br>
into the request body filter chain via the <br>
ngx_http_top_request_body_filter, what you are trying to do is <br>
wrong.<br>
<br>
You cannot stop reading the request body at arbitrary time and <br>
switch to different processing.  This will leave the body <br>
half-read, in an inconsistent state, and this in turn will cause <br>
various problem during further processing.  That is, connection <br>
hang you see is an expected result.<br>
<br>
In the request body filter you have to either return a fatal <br>
error, or raise some internal flag for your processing, and then <br>
act on this flag after the body is fully read.<br>
<br>
-- <br>
Maxim Dounin<br>
<a href="http://mdounin.ru/" rel="noreferrer" target="_blank">http://mdounin.ru/</a><br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-devel" rel="noreferrer" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
</blockquote></div>