# HG changeset patch # User Vadim Fedorenko <vadim.fedore...@cdnnow.ru> # Date 1649889268 -10800 # Thu Apr 14 01:34:28 2022 +0300 # Node ID ed7a2c031475bcb252952a467c184c94652b926a # Parent a736a7a613ea6e182ff86fbadcb98bb0f8891c0b Upstream: prioritise Cache-Control over Expires.
RFC7234 explicitly says that cache recipient MUST ignore Expires header if response includes Cache-Control header with max-age or s-maxage directives. Previously Cache-Control was ignored if it was after Expires in reply headers. At the same time this patch makes more stable behaviour of using latest value of header Cache-Control even if previous value was 0. Ticket #964 for more information. --- src/http/ngx_http_upstream.c | 25 +++++++++++++++++++++++++ src/http/ngx_http_upstream.h | 15 +++++++++++++++ 2 files changed, 40 insertions(+) diff -r a736a7a613ea -r ed7a2c031475 src/http/ngx_http_upstream.c --- a/src/http/ngx_http_upstream.c Tue Feb 08 17:35:27 2022 +0300 +++ b/src/http/ngx_http_upstream.c Thu Apr 14 01:34:28 2022 +0300 @@ -868,6 +868,7 @@ } u->cacheable = 1; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_DEFAULT; c = r->cache; @@ -970,6 +971,7 @@ case NGX_HTTP_CACHE_SCARCE: u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_SCARCE; break; @@ -992,6 +994,7 @@ if (ngx_http_upstream_cache_check_range(r, u) == NGX_DECLINED) { u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_RANGE; } r->cached = 0; @@ -3105,6 +3108,7 @@ case NGX_DECLINED: u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_NO_CACHE; break; default: /* NGX_OK */ @@ -3165,6 +3169,7 @@ } else { u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_INVALID; } } @@ -4690,6 +4695,7 @@ #if (NGX_HTTP_CACHE) if (!(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_SET_COOKIE)) { u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_COOKIE; } #endif @@ -4747,6 +4753,7 @@ || ngx_strlcasestrn(start, last, (u_char *) "private", 7 - 1) != NULL) { u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_NO_CACHE; return NGX_OK; } @@ -4772,15 +4779,21 @@ } u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_CACHECTRL0; return NGX_OK; } if (n == 0) { u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_CACHECTRL0; return NGX_OK; } r->cache->valid_sec = ngx_time() + n; + u->cacheable_reason &= ~(NGX_HTTP_CACHEABLE_CACHECTRL0|NGX_HTTP_CACHEABLE_EXPIRES); + if (u->cacheable_reason == NGX_HTTP_CACHEABLE_DEFAULT) { + u->cacheable = 1; + } } p = ngx_strlcasestrn(start, last, (u_char *) "stale-while-revalidate=", @@ -4800,9 +4813,13 @@ } u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_CACHECTRL1; return NGX_OK; } + if (u->cacheable_reason == NGX_HTTP_CACHEABLE_DEFAULT) { + u->cacheable = 1; + } r->cache->updating_sec = n; r->cache->error_sec = n; } @@ -4823,10 +4840,15 @@ } u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_CACHECTRL2; return NGX_OK; } r->cache->error_sec = n; + u->cacheable_reason &= ~NGX_HTTP_CACHEABLE_EXPIRES; + if (u->cacheable_reason == NGX_HTTP_CACHEABLE_DEFAULT) { + u->cacheable = 1; + } } } #endif @@ -4864,6 +4886,7 @@ if (expires == NGX_ERROR || expires < ngx_time()) { u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_EXPIRES; return NGX_OK; } @@ -4907,6 +4930,7 @@ switch (n) { case 0: u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_XACCEL; /* fall through */ case NGX_ERROR: @@ -5067,6 +5091,7 @@ || (h->value.len == 1 && h->value.data[0] == '*')) { u->cacheable = 0; + u->cacheable_reason |= NGX_HTTP_CACHEABLE_VARY; } r->cache->vary = h->value; diff -r a736a7a613ea -r ed7a2c031475 src/http/ngx_http_upstream.h --- a/src/http/ngx_http_upstream.h Tue Feb 08 17:35:27 2022 +0300 +++ b/src/http/ngx_http_upstream.h Thu Apr 14 01:34:28 2022 +0300 @@ -320,6 +320,20 @@ ngx_http_upstream_t *u); +#define NGX_HTTP_CACHEABLE_DEFAULT 0x80000000 +#define NGX_HTTP_CACHEABLE_SCARCE 0x00000001 +#define NGX_HTTP_CACHEABLE_RANGE 0x00000002 +#define NGX_HTTP_CACHEABLE_INVALID 0x00000004 +#define NGX_HTTP_CACHEABLE_NO_CACHE 0x00000010 +#define NGX_HTTP_CACHEABLE_EXPIRES 0x00000020 +#define NGX_HTTP_CACHEABLE_COOKIE 0x00000040 +#define NGX_HTTP_CACHEABLE_CACHECTRL0 0x00000100 +#define NGX_HTTP_CACHEABLE_CACHECTRL1 0x00000200 +#define NGX_HTTP_CACHEABLE_CACHECTRL2 0x00000400 +#define NGX_HTTP_CACHEABLE_XACCEL 0x00001000 +#define NGX_HTTP_CACHEABLE_VARY 0x00002000 + + struct ngx_http_upstream_s { ngx_http_upstream_handler_pt read_event_handler; ngx_http_upstream_handler_pt write_event_handler; @@ -384,6 +398,7 @@ ngx_http_cleanup_pt *cleanup; + ngx_uint_t cacheable_reason; unsigned store:1; unsigned cacheable:1; unsigned accel:1; _______________________________________________ nginx-devel mailing list -- nginx-devel@nginx.org To unsubscribe send an email to nginx-devel-le...@nginx.org