Welcome! Log In Create A New Profile

Advanced

Re: [PATCH 17 of 20] Upstream: handling of multiple Vary headers (ticket #1423)

Sergey Kandaurov
May 11, 2022 04:48PM
On Thu, Apr 21, 2022 at 01:18:57AM +0300, Maxim Dounin wrote:
> # HG changeset patch
> # User Maxim Dounin <mdounin@mdounin.ru>
> # Date 1650492340 -10800
> # Thu Apr 21 01:05:40 2022 +0300
> # Node ID 2027b85971d4b8a7e33c018548468057cb57eaf7
> # Parent f460a2f9f88d264ef6c8588eb37bcb85c48010db
> Upstream: handling of multiple Vary headers (ticket #1423).
>
> Previously, only the last header value was used when caching.
>
> diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
> --- a/src/http/ngx_http_upstream.c
> +++ b/src/http/ngx_http_upstream.c
> @@ -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;
>
> @@ -5192,17 +5195,47 @@ ngx_http_upstream_process_vary(ngx_http_
> return NGX_OK;
> }
>
> - if (r->cache == NULL) {
> + if (r->cache == NULL || !u->cacheable) {
> + return NGX_OK;
> + }
> +
> + if (h->value.len == 1 && h->value.data[0] == '*') {
> + u->cacheable = 0;
> return NGX_OK;
> }
>
> - if (h->value.len > NGX_HTTP_CACHE_VARY_LEN
> - || (h->value.len == 1 && h->value.data[0] == '*'))
> - {
> + 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);

(h->next == NULL) check missing

> + *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
>

Memory from the pool could be allocated just once among multiple values
if postpone it to somewhere else (but probably it's not worth it).

Combined patch on top off:

# HG changeset patch
# User Sergey Kandaurov <pluknet@nginx.com>
# Date 1652193477 -14400
# Tue May 10 18:37:57 2022 +0400
# Node ID cffc4a23b8bb69143d4128b2249b0b87d5fd68cb
# Parent facf698a696385b7b07abc0b2f7e5c1f6394a486
imported patch p17b

diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -55,6 +55,8 @@ static ngx_int_t ngx_http_upstream_inter
static ngx_int_t ngx_http_upstream_test_connect(ngx_connection_t *c);
static ngx_int_t ngx_http_upstream_process_headers(ngx_http_request_t *r,
ngx_http_upstream_t *u);
+static ngx_int_t ngx_http_upstream_process_vary_headers(ngx_http_request_t *r,
+ ngx_http_upstream_t *u);
static ngx_int_t ngx_http_upstream_process_trailers(ngx_http_request_t *r,
ngx_http_upstream_t *u);
static void ngx_http_upstream_send_response(ngx_http_request_t *r,
@@ -2788,6 +2790,12 @@ ngx_http_upstream_process_headers(ngx_ht

umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);

+ if (ngx_http_upstream_process_vary_headers(r, u) != NGX_OK) {
+ ngx_http_upstream_finalize_request(r, u,
+ NGX_HTTP_INTERNAL_SERVER_ERROR);
+ return NGX_DONE;
+ }
+
if (u->headers_in.x_accel_redirect
&& !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT))
{
@@ -2928,6 +2936,73 @@ ngx_http_upstream_process_headers(ngx_ht


static ngx_int_t
+ngx_http_upstream_process_vary_headers(ngx_http_request_t *r,
+ ngx_http_upstream_t *u)
+{
+ u_char *p;
+ size_t len;
+ ngx_str_t vary;
+ ngx_table_elt_t *h;
+
+#if (NGX_HTTP_CACHE)
+
+ if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_VARY) {
+ return NGX_OK;
+ }
+
+ if (r->cache == NULL || !u->cacheable) {
+ return NGX_OK;
+ }
+
+ if (u->headers_in.vary == NULL) {
+ 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 = u->headers_in.vary->value;
+ }
+
+ if (vary.len > NGX_HTTP_CACHE_VARY_LEN) {
+ u->cacheable = 0;
+ }
+
+ r->cache->vary = vary;
+
+#endif
+
+ return NGX_OK;
+}
+
+
+static ngx_int_t
ngx_http_upstream_process_trailers(ngx_http_request_t *r,
ngx_http_upstream_t *u)
{
@@ -5175,9 +5250,6 @@ 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;

@@ -5189,60 +5261,9 @@ ngx_http_upstream_process_vary(ngx_http_
*ph = h;
h->next = NULL;

-#if (NGX_HTTP_CACHE)
-
- if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_VARY) {
- return NGX_OK;
- }
-
- if (r->cache == NULL || !u->cacheable) {
- return NGX_OK;
- }
-
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 = vary;
-
-#endif
+ }

return NGX_OK;
}
_______________________________________________
nginx-devel mailing list -- nginx-devel@nginx.org
To unsubscribe send an email to nginx-devel-leave@nginx.org
Subject Author Views Posted

[PATCH 00 of 20] multiple headers handling

Maxim Dounin 947 April 20, 2022 06:38PM

[PATCH 03 of 20] SCGI: combining headers with identical names (ticket #1724)

Maxim Dounin 239 April 20, 2022 06:40PM

[PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Maxim Dounin 191 April 20, 2022 06:42PM

Re: [PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Sergey Kandaurov 240 May 11, 2022 11:36AM

Re: [PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Maxim Dounin 154 May 12, 2022 06:34PM

Re: [PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Sergey Kandaurov 251 May 13, 2022 10:06AM

Re: [PATCH 02 of 20] FastCGI: combining headers with identical names (ticket #1724)

Sergey Kandaurov 158 May 13, 2022 10:06AM

[PATCH 04 of 20] Uwsgi: combining headers with identical names (ticket #1724)

Maxim Dounin 206 April 20, 2022 06:44PM

[PATCH 08 of 20] Perl: all known input headers are handled identically

Maxim Dounin 276 April 20, 2022 06:44PM

[PATCH 10 of 20] Upstream: style

Maxim Dounin 241 April 20, 2022 06:46PM

[PATCH 07 of 20] All non-unique input headers are now linked lists

Maxim Dounin 324 April 20, 2022 06:48PM

Re: [PATCH 07 of 20] All non-unique input headers are now linked lists

Sergey Kandaurov 309 May 11, 2022 03:44PM

Re: [PATCH 07 of 20] All non-unique input headers are now linked lists

Maxim Dounin 156 May 12, 2022 07:56PM

[PATCH 09 of 20] Perl: combining unknown headers during $r->header_in() lookup

Maxim Dounin 186 April 20, 2022 06:50PM

[PATCH 12 of 20] Upstream: simplified Accept-Ranges handling

Maxim Dounin 338 April 20, 2022 06:52PM

[PATCH 11 of 20] Upstream: simplified Content-Encoding handling

Maxim Dounin 238 April 20, 2022 06:54PM

Re: [PATCH 11 of 20] Upstream: simplified Content-Encoding handling

Sergey Kandaurov 197 May 11, 2022 04:02PM

Re: [PATCH 11 of 20] Upstream: simplified Content-Encoding handling

Maxim Dounin 186 May 12, 2022 08:20PM

[PATCH 05 of 20] Combining unknown headers during variables lookup (ticket #1316)

Maxim Dounin 167 April 20, 2022 06:56PM

Re: [PATCH 05 of 20] Combining unknown headers during variables lookup (ticket #1316)

Sergey Kandaurov 206 May 11, 2022 12:12PM

Re: [PATCH 05 of 20] Combining unknown headers during variables lookup (ticket #1316)

Maxim Dounin 270 May 12, 2022 07:18PM

[PATCH 06 of 20] Reworked multi headers to use linked lists

Maxim Dounin 253 April 20, 2022 06:58PM

Re: [PATCH 06 of 20] Reworked multi headers to use linked lists

Sergey Kandaurov 178 May 11, 2022 03:24PM

Re: [PATCH 06 of 20] Reworked multi headers to use linked lists

Maxim Dounin 202 May 12, 2022 07:44PM

Re: [PATCH 06 of 20] Reworked multi headers to use linked lists

Sergey Kandaurov 347 June 13, 2022 01:08PM

Re: [PATCH 06 of 20] Reworked multi headers to use linked lists

Maxim Dounin 188 June 13, 2022 06:52PM

[PATCH 14 of 20] Upstream: all known headers in u->headers_in are linked lists now

Maxim Dounin 233 April 20, 2022 07:00PM

[PATCH 13 of 20] All known output headers can be linked lists now

Maxim Dounin 171 April 20, 2022 07:02PM

[PATCH 15 of 20] Upstream: header handlers can now return parsing errors

Maxim Dounin 157 April 20, 2022 07:04PM

Re: [PATCH 15 of 20] Upstream: header handlers can now return parsing errors

Sergey Kandaurov 174 May 11, 2022 04:30PM

Re: [PATCH 15 of 20] Upstream: header handlers can now return parsing errors

Maxim Dounin 179 May 12, 2022 08:26PM

[PATCH 17 of 20] Upstream: handling of multiple Vary headers (ticket #1423)

Maxim Dounin 197 April 20, 2022 07:06PM

Re: [PATCH 17 of 20] Upstream: handling of multiple Vary headers (ticket #1423)

Sergey Kandaurov 184 May 11, 2022 04:48PM

Re: [PATCH 17 of 20] Upstream: handling of multiple Vary headers (ticket #1423)

Maxim Dounin 152 May 12, 2022 08:52PM

[PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 164 April 20, 2022 07:08PM

Re: [PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Sergey Kandaurov 194 May 11, 2022 05:06PM

Re: [PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 162 May 12, 2022 10:00PM

Re: [PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Sergey Kandaurov 176 May 20, 2022 09:56AM

Re: [PATCH 18 of 20] Upstream: multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 166 May 20, 2022 05:10PM

[PATCH 16 of 20] Upstream: duplicate headers ignored or properly linked

Maxim Dounin 214 April 20, 2022 07:10PM

Re: [PATCH 16 of 20] Upstream: duplicate headers ignored or properly linked

Sergey Kandaurov 162 May 11, 2022 04:36PM

Re: [PATCH 16 of 20] Upstream: duplicate headers ignored or properly linked

Maxim Dounin 528 May 12, 2022 08:36PM

[PATCH 20 of 20] Headers filter: improved memory allocation error handling

Maxim Dounin 207 April 20, 2022 07:12PM

[PATCH 19 of 20] Auth request: multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 215 April 20, 2022 07:14PM

[PATCH 00 of 10] multiple headers tests

Maxim Dounin 208 April 20, 2022 07:16PM

[PATCH 01 of 10] Tests: tests for passing Date and Server headers

Maxim Dounin 166 April 20, 2022 07:18PM

[PATCH 02 of 10] Tests: fastcgi tests for combining headers

Maxim Dounin 229 April 20, 2022 07:20PM

[PATCH 03 of 10] Tests: scgi tests for combining headers

Maxim Dounin 174 April 20, 2022 07:20PM

[PATCH 04 of 10] Tests: uwsgi tests for combining headers

Maxim Dounin 143 April 20, 2022 07:22PM

[PATCH 07 of 10] Tests: perl $r->header_in() combining headers test

Maxim Dounin 157 April 20, 2022 07:24PM

[PATCH 09 of 10] Tests: tests for multiple Vary headers (ticket #1423)

Maxim Dounin 161 April 20, 2022 07:26PM

[PATCH 06 of 10] Tests: perl $r->header_in("Connection") test

Maxim Dounin 164 April 20, 2022 07:28PM

[PATCH 05 of 10] Tests: tests for various http header variables

Maxim Dounin 214 April 20, 2022 07:30PM

[PATCH 08 of 10] Tests: tests for duplicate response headers

Maxim Dounin 177 April 20, 2022 07:32PM

[PATCH 10 of 10] Tests: tests for multiple WWW-Authenticate headers (ticket #485)

Maxim Dounin 190 April 20, 2022 07:34PM

Re: [PATCH 00 of 10] multiple headers tests

Sergey Kandaurov 212 May 31, 2022 07:14PM

Re: [PATCH 00 of 10] multiple headers tests

Maxim Dounin 150 June 03, 2022 07:26PM



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

Online Users

Guests: 140
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 500 on July 15, 2024
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready