Subrequest using Parent Request Body
Maxim Dounin
mdounin at mdounin.ru
Tue May 11 05:41:21 MSD 2010
Hello!
On Fri, May 07, 2010 at 03:38:54PM -0700, Matthieu Tourne wrote:
> I'm trying to send a POST Subrequest using the same request_body as the
> Parent Request.
> The subrequest is sent first, and once it has been finalized the parent
> request goes through.
> (this is inspired on Maxim's ngx_http_auth_request_module)
>
> It works almost fine, but if I try to make this subrequest to a location
> containing a proxy_pass, I get some weird behavior. (The connection takes
> forever to terminate).
>
> My guess is that the request_body gets read by the upstream, and discarded.
> When the parent request goes through, that data is not available anymore.
If you issue subrequest before request body was read by main
request, you likely get SIGSEGV on an attempt to read it. If you
didn't - you probably just didn't used -DDEBUG_MALLOC while
compiling nginx (or appropriate malloc options in your OS). It's
only possible to read request body in main request.
> If I create a dummy request_body for the subrequest with temporary buffers,
> it seems to work fine.
>
> I think I might be able to get around this by reading first the original
> request_body using ngx_http_read_client_request_body(),
> and then copying the content of r->request_body to temporary buffers in my
> subrequest.
There is no good/reliable way to preserve request body and use it
for two upstream requests. There are no problems with in-memory
buffer (at least I'm not aware of), but once your request body is
buffered to temporary file - it will be released by first
successful upstream request (see ngx_http_upstream_send_response()
in ngx_http_upstream.c).
Using dupfd() on temporary file descriptor may be an option, but
it's your responsibility to do it properly.
Maxim Dounin
More information about the nginx
mailing list