Welcome! Log In Create A New Profile

Advanced

[nginx] svn commit: r4275 - trunk/src/http/modules

Anonymous User
November 14, 2011 08:20AM
Author: mdounin
Date: 2011-11-14 13:18:15 +0000 (Mon, 14 Nov 2011)
New Revision: 4275

Log:
Fixed proxy_set_header inheritance with proxy_cache (ticket #45).

Headers cleared with cache enabled (If-Modified-Since etc.) might be cleared
in unrelated servers/locations without proxy_cache enabled if proxy_cache was
used in some server/location.

Example config which triggered the problem:

proxy_set_header X-Test "test";
server { location /1 { proxy_cache name; proxy_pass ... } }
server { location /2 { proxy_pass ... } }

Another one:

server {
proxy_cache name;
location /1 { proxy_pass ... }
location /2 { proxy_cache off; proxy_pass ... }
}

In both cases If-Modified-Since header wasn't sent to backend in location /2.

Fix is to not modify conf->headers_source, but instead merge user-supplied
headers from conf->headers_source and default headers (either cache or not)
into separate headers_merged array.


Modified:
trunk/src/http/modules/ngx_http_proxy_module.c

Modified: trunk/src/http/modules/ngx_http_proxy_module.c
===================================================================
--- trunk/src/http/modules/ngx_http_proxy_module.c 2011-11-14 09:12:15 UTC (rev 4274)
+++ trunk/src/http/modules/ngx_http_proxy_module.c 2011-11-14 13:18:15 UTC (rev 4275)
@@ -2875,7 +2875,7 @@
size_t size;
uintptr_t *code;
ngx_uint_t i;
- ngx_array_t headers_names;
+ ngx_array_t headers_names, headers_merged;
ngx_keyval_t *src, *s, *h;
ngx_hash_key_t *hk;
ngx_hash_init_t hash;
@@ -2906,6 +2906,12 @@
return NGX_ERROR;
}

+ if (ngx_array_init(&headers_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t))
+ != NGX_OK)
+ {
+ return NGX_ERROR;
+ }
+
if (conf->headers_source == NULL) {
conf->headers_source = ngx_array_create(cf->pool, 4,
sizeof(ngx_keyval_t));
@@ -2925,8 +2931,6 @@
}


- src = conf->headers_source->elts;
-
#if (NGX_HTTP_CACHE)

h = conf->upstream.cache ? ngx_http_proxy_cache_headers:
@@ -2937,31 +2941,41 @@

#endif

+ src = conf->headers_source->elts;
+ for (i = 0; i < conf->headers_source->nelts; i++) {
+
+ s = ngx_array_push(&headers_merged);
+ if (s == NULL) {
+ return NGX_ERROR;
+ }
+
+ *s = src[i];
+ }
+
while (h->key.len) {

- for (i = 0; i < conf->headers_source->nelts; i++) {
+ src = headers_merged.elts;
+ for (i = 0; i < headers_merged.nelts; i++) {
if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {
goto next;
}
}

- s = ngx_array_push(conf->headers_source);
+ s = ngx_array_push(&headers_merged);
if (s == NULL) {
return NGX_ERROR;
}

*s = *h;

- src = conf->headers_source->elts;
-
next:

h++;
}


- src = conf->headers_source->elts;
- for (i = 0; i < conf->headers_source->nelts; i++) {
+ src = headers_merged.elts;
+ for (i = 0; i < headers_merged.nelts; i++) {

hk = ngx_array_push(&headers_names);
if (hk == NULL) {

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] svn commit: r4275 - trunk/src/http/modules

Anonymous User 1382 November 14, 2011 08:20AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 173
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready