Skip to content

Commit

Permalink
Upstream: handling of multiple Vary headers (ticket #1423).
Browse files Browse the repository at this point in the history
Previously, only the last header value was used when caching.
  • Loading branch information
mdounin committed May 30, 2022
1 parent b8815c7 commit 260f488
Showing 1 changed file with 43 additions and 5 deletions.
48 changes: 43 additions & 5 deletions src/http/ngx_http_upstream.c
Original file line number Diff line number Diff line change
Expand Up @@ -5175,6 +5175,9 @@ static ngx_int_t
ngx_http_upstream_process_vary(ngx_http_request_t *r,
ngx_table_elt_t *h, ngx_uint_t offset)
{
u_char *p;
size_t len;
ngx_str_t vary;
ngx_table_elt_t **ph;
ngx_http_upstream_t *u;

Expand All @@ -5192,17 +5195,52 @@ ngx_http_upstream_process_vary(ngx_http_request_t *r,
return NGX_OK;
}

if (r->cache == NULL) {
if (r->cache == NULL || !u->cacheable) {
return NGX_OK;
}

if (h->value.len > NGX_HTTP_CACHE_VARY_LEN
|| (h->value.len == 1 && h->value.data[0] == '*'))
{
if (h->value.len == 1 && h->value.data[0] == '*') {
u->cacheable = 0;
return NGX_OK;
}

if (u->headers_in.vary->next) {

len = 0;

for (h = u->headers_in.vary; h; h = h->next) {
len += h->value.len + 2;
}

len -= 2;

p = ngx_pnalloc(r->pool, len);
if (p == NULL) {
return NGX_ERROR;
}

vary.len = len;
vary.data = p;

for (h = u->headers_in.vary; h; h = h->next) {
p = ngx_copy(p, h->value.data, h->value.len);

if (h->next == NULL) {
break;
}

*p++ = ','; *p++ = ' ';
}

} else {
vary = h->value;
}

if (vary.len > NGX_HTTP_CACHE_VARY_LEN) {
u->cacheable = 0;
}

r->cache->vary = h->value;
r->cache->vary = vary;

#endif

Expand Down

0 comments on commit 260f488

Please sign in to comment.