Subrequests from body filters

Maxim Dounin mdounin at
Mon Mar 25 14:54:42 UTC 2013


On Mon, Mar 25, 2013 at 06:46:09PM +0400, Marat Dakota wrote:

> >> >> But is it ok to call next body filter in subrequest's body filter to
> >> >> produce output to main request?
> >> >> I mean ngx_http_next_body_filter(r->main, out).
> >> >
> >> > No.  You should call next body filter of the request you are
> >> > working with.  It's postpone filter responsibility to manage
> >> > subrequests output, and if you try to do this yourself instead -
> >> > result will be undefined.
> >>
> >> It seems to work as expected for me. How can I cause problems with this?
> >
> > Undefined behaviour sometimes appear to work as expected.  This
> > doesn't mean it's correct though.
> >
> > Depending on the exact place in a filter chain where you did it
> > and various other factors like timings, results may vary from
> > "nothing bad might happen, as r == r->main anyway" to "response
> > will completely incorrect as wrong filters will be applied to the
> > response body".
> >
> > Most trivial thing to test is probably a subrequest order, which
> > likely will be wrong in your case if first subrequest will take
> > longer to handle than second one.
> Subrequests order doesn't matter much for me. I feed my library (the
> one I write a Nginx module for) with a subrequests results in a
> whatever order and my library returns next chunk of response only when
> it is ready.
> My library has just one function to call. This function returns the
> next chunk of data (if any) to send as a response and/or a list of
> subrequests to make. In every call to subrequest body filter I pass
> subrequest's response to my library and get a new list of subrequests
> (if any) and a new chunk of final response (if any). And so on, until
> my library says it's done.
> And if I really do something wrong in terms of Nginx architecture,
> please, could you give me more details about how to achieve my goals
> correctly?

I don't really see why you don't call ngx_http_next_body_filter(r, 
out), which is perfectly correct.

Maxim Dounin

More information about the nginx-devel mailing list