unparsed_uri setting in ngx_http_subrequest?

Maxim Dounin mdounin at mdounin.ru
Sat Feb 27 21:17:38 MSK 2010


Hello!

On Sat, Feb 27, 2010 at 09:39:56AM -0800, Brian Pane wrote:

> I think I've found a separate bug in ngx_http_subrequest:
> 
> ngx_http_core_module.c, line 2080 (in 0.8.33):
>     sr->headers_in = r->headers_in;
> 
> This results in a bitwise copy of headers_in from the parent request
> to the subrequest.  Inside headers_in is a list:
> typedef struct {
>     ngx_list_t                        headers;
>     // ...
> } ngx_http_headers_in_t;
> 
> When you do a bitwise copy of an ngx_list_t, you end up with a broken
> list.  Specifically, sr->headers_in->list->last in the subrequest
> points to the last node in the r->headers_in.list.part chain in the
> parent request.  It should instead point to the last node in the
> subrequest's sr->headers_in.list.part chain.
> 
> Thus if any module attempts to add more headers to the subrequest's
> sr->headers_in, they actually will be added to the parent request's
> r->headers_in instead.
> 
> I ran into this problem in a module that needs to add extra request
> headers to a proxied subrequest.

It is expected that r->headers_in represent headers got from 
client (i.e. inbound headers).  It is not expected to be modified 
by anything but nginx core when it reads headers from client (and 
some modules which sets special variables there, like 
r->headers_in.user).

To add headers to proxied [sub]request you have to use means 
provided by proxy module, specifically proxy_set_header 
configuration directive.

Maxim Dounin



More information about the nginx-devel mailing list