Mercurial > hg > nginx-quic
diff src/http/modules/ngx_http_proxy_module.c @ 5909:8d0cf26ce071
Upstream: different header lists for cached and uncached requests.
The upstream modules remove and alter a number of client headers
before sending the request to upstream. This set of headers is
smaller or even empty when cache is disabled.
It's still possible that a request in a cache-enabled location is
uncached, for example, if cache entry counter is below min_uses.
In this case it's better to alter a smaller set of headers and
pass more client headers to backend unchanged. One of the benefits
is enabling server-side byte ranges in such requests.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Wed, 19 Nov 2014 17:33:23 +0300 |
parents | f8e80f8c7fc7 |
children | 29fa5023bd6f |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_proxy_module.c +++ b/src/http/modules/ngx_http_proxy_module.c @@ -55,6 +55,9 @@ typedef struct { ngx_array_t *body_set; ngx_http_proxy_headers_t headers; +#if (NGX_HTTP_CACHE) + ngx_http_proxy_headers_t headers_cache; +#endif ngx_array_t *headers_source; ngx_array_t *proxy_lengths; @@ -153,7 +156,8 @@ static void *ngx_http_proxy_create_loc_c static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child); static ngx_int_t ngx_http_proxy_init_headers(ngx_conf_t *cf, - ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_headers_t *headers); + ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_headers_t *headers, + ngx_keyval_t *default_headers); static char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); @@ -1095,7 +1099,11 @@ ngx_http_proxy_create_request(ngx_http_r plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); +#if (NGX_HTTP_CACHE) + headers = u->cacheable ? &plcf->headers_cache : &plcf->headers; +#else headers = &plcf->headers; +#endif if (u->method.len) { /* HEAD was changed to GET to cache response */ @@ -2515,6 +2523,9 @@ ngx_http_proxy_create_loc_conf(ngx_conf_ * conf->headers.lengths = NULL; * conf->headers.values = NULL; * conf->headers.hash = { NULL, 0 }; + * conf->headers_cache.lengths = NULL; + * conf->headers_cache.values = NULL; + * conf->headers_cache.hash = { NULL, 0 }; * conf->body_set_len = NULL; * conf->body_set = NULL; * conf->body_source = { 0, NULL }; @@ -2606,6 +2617,7 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t u_char *p; size_t size; + ngx_int_t rc; ngx_hash_init_t hash; ngx_http_core_loc_conf_t *clcf; ngx_http_proxy_rewrite_t *pr; @@ -3028,26 +3040,37 @@ ngx_http_proxy_merge_loc_conf(ngx_conf_t if (conf->headers_source == NULL) { conf->headers = prev->headers; +#if (NGX_HTTP_CACHE) + conf->headers_cache = prev->headers_cache; +#endif conf->headers_source = prev->headers_source; } + rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers, + ngx_http_proxy_headers); + if (rc != NGX_OK) { + return NGX_CONF_ERROR; + } + #if (NGX_HTTP_CACHE) - if ((conf->upstream.cache == NULL) != (prev->upstream.cache == NULL)) { - conf->headers.hash.buckets = NULL; + + if (conf->upstream.cache) { + rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers_cache, + ngx_http_proxy_cache_headers); + if (rc != NGX_OK) { + return NGX_CONF_ERROR; + } } + #endif - if (ngx_http_proxy_init_headers(cf, conf, &conf->headers) != NGX_OK) { - return NGX_CONF_ERROR; - } - return NGX_CONF_OK; } static ngx_int_t ngx_http_proxy_init_headers(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *conf, - ngx_http_proxy_headers_t *headers) + ngx_http_proxy_headers_t *headers, ngx_keyval_t *default_headers) { u_char *p; size_t size; @@ -3094,17 +3117,6 @@ ngx_http_proxy_init_headers(ngx_conf_t * return NGX_ERROR; } - -#if (NGX_HTTP_CACHE) - - h = conf->upstream.cache ? ngx_http_proxy_cache_headers: - ngx_http_proxy_headers; -#else - - h = ngx_http_proxy_headers; - -#endif - src = conf->headers_source->elts; for (i = 0; i < conf->headers_source->nelts; i++) { @@ -3116,6 +3128,8 @@ ngx_http_proxy_init_headers(ngx_conf_t * *s = src[i]; } + h = default_headers; + while (h->key.len) { src = headers_merged.elts;