atom feed6 messages in ru.sysoev.nginxRe: [dev] some questions about subreq...
FromSent OnAttachments
Manlio PerilloMar 27, 2008 4:52 am 
Sergey BochenkovMar 27, 2008 7:28 am 
Manlio PerilloMar 28, 2008 5:21 am 
Sergey BochenkovMar 28, 2008 6:13 am 
Manlio PerilloMar 29, 2008 5:18 am 
Manlio PerilloMar 29, 2008 3:15 pm 
Subject:Re: [dev] some questions about subrequests
From:Sergey Bochenkov (bach@public.gmane.org)
Date:Mar 28, 2008 6:13:38 am
List:ru.sysoev.nginx

On Fri, 28 Mar 2008 13:21:31 +0100 Manlio Perillo <manlio_perillo-VGgt2q2+T+FeoW@public.gmane.org> wrote:

Sergey Bochenkov ha scritto:

NGX_HTTP_ZERO_IN_URI:

src/http/ngx_http_core_module.c: sr->zero_in_uri = (flags & NGX_HTTP_ZERO_IN_URI) != 0;

src/http/ngx_http_request.h: /* URI with "\0" or "%00" */ unsigned zero_in_uri:1;

Obviously, IMHO.

Yes, this was easy!

NGX_HTTP_SUBREQUEST_IN_MEMORY:

src/http/ngx_http_core_module.c: sr->subrequest_in_memory = (flags & NGX_HTTP_SUBREQUEST_IN_MEMORY) != 0;

src/http/ngx_http_upstream.c: if (!r->subrequest_in_memory) { ngx_http_upstream_send_response(r, u); return; }

/* subrequest content in memory */

...

So, as I can understand from using-of-subrequests point of view, r->subrequest_in_memory flag tells ngx_http_upstream_module to save a pointer to the full chain of response buffers in r->upstream->out_bufs chain-link. And *not-to-free* that buffers after subrequest was finished.

Fix me, if I'm wrong.

I'm not sure, but it seems that I can safely set flags to 0.

If you need to keep the upstream response in memory, NGX_HTTP_SUBREQUEST_IN_MEMORY flag may be useful for you. You can also set the r->filter_need_in_memory flag in header-filter and read full response body in the body-filter.

I have one more, important, question. When will be the post_subrequest->handler called? Always after ngx_http_subrequest returns?

The ngx_http_subrequest()-function is asyncronous and returns immediately after all appropriate fields of ngx_http_request_t structure will be filled. It doesn't wait for any upstream answer at all.

The handler will be called after the end of the *subrequest*, not the end of ngx_http_subrequest()-function call.

Here you can find the appropriate discussion (unfortunately, in russian): http://article.gmane.org/gmane.comp.web.nginx.russian/11160