Welcome! Log In Create A New Profile

Advanced

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

Maxim Dounin
May 12, 2022 07:56PM
Hello!

On Wed, May 11, 2022 at 11:40:48PM +0400, Sergey Kandaurov wrote:

> On Thu, Apr 21, 2022 at 01:18:47AM +0300, Maxim Dounin wrote:
> > # HG changeset patch
> > # User Maxim Dounin <mdounin@mdounin.ru>
> > # Date 1650492324 -10800
> > # Thu Apr 21 01:05:24 2022 +0300
> > # Node ID 238d1f5f438735432822689605fa37b1b0e01517
> > # Parent 50fe52f516ff9c148aa9e7dfcc1c31cc6a4929ae
> > All non-unique input headers are now linked lists.
> >
> > The ngx_http_process_multi_header_lines() function is removed, as it is
> > exactly equivalent to ngx_http_process_header_line(). Similarly,
> > ngx_http_variable_header() is used instead of ngx_http_variable_headers().
> >
> > diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
> > --- a/src/http/ngx_http_request.c
> > +++ b/src/http/ngx_http_request.c
> > @@ -22,8 +22,6 @@ static ngx_int_t ngx_http_process_header
> > ngx_table_elt_t *h, ngx_uint_t offset);
> > static ngx_int_t ngx_http_process_unique_header_line(ngx_http_request_t *r,
> > ngx_table_elt_t *h, ngx_uint_t offset);
> > -static ngx_int_t ngx_http_process_multi_header_lines(ngx_http_request_t *r,
> > - ngx_table_elt_t *h, ngx_uint_t offset);
> > static ngx_int_t ngx_http_process_host(ngx_http_request_t *r,
> > ngx_table_elt_t *h, ngx_uint_t offset);
> > static ngx_int_t ngx_http_process_connection(ngx_http_request_t *r,
> > @@ -164,7 +162,7 @@ ngx_http_header_t ngx_http_headers_in[]
> > #if (NGX_HTTP_X_FORWARDED_FOR)
> > { ngx_string("X-Forwarded-For"),
> > offsetof(ngx_http_headers_in_t, x_forwarded_for),
> > - ngx_http_process_multi_header_lines },
> > + ngx_http_process_header_line },
> > #endif
> >
> > #if (NGX_HTTP_REALIP)
> > @@ -197,7 +195,7 @@ ngx_http_header_t ngx_http_headers_in[]
> > #endif
> >
> > { ngx_string("Cookie"), offsetof(ngx_http_headers_in_t, cookie),
> > - ngx_http_process_multi_header_lines },
> > + ngx_http_process_header_line },
> >
> > { ngx_null_string, 0, NULL }
> > };
> > @@ -1742,10 +1740,10 @@ ngx_http_process_header_line(ngx_http_re
> >
> > ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);
> >
> > - if (*ph == NULL) {
> > - *ph = h;
> > - h->next = NULL;
> > - }
> > + while (*ph) { ph = &(*ph)->next; }
> > +
> > + *ph = h;
> > + h->next = NULL;
> >
> > return NGX_OK;
> > }
>
> Essentially, this makes the following headers multi-valuable,
> which are specified (or otherwise implied) to have a single value:
> Referer, Content-Type, Range, Keep-Alive, X-Real-IP,
> also DAV headers (including Date) and User-Agent (as below).
> This makes proxying comma-delimited header values to backend, such as:
> Date: Wed, 11 May 2022 19:29:54 GMT
> Date: Wed, 11 May 2022 19:29:55 GMT
> ->
> HTTP_DATE: Wed, 11 May 2022 19:29:54 GMT, Wed, 11 May 2022 19:29:55 GMT
>
> Convert them to ngx_http_process_unique_header_line() ?

I don't think this change affects proxying: both previously and
with the patch all headers were proxied. The difference is that
now nginx itself can access all the headers provided if it needs
to (or reject particular requests if it the particular header
might be important).

While rejecting requests with such duplicate headers might be
correct thing to do, it might not be the optimal approach from the
robustness point of view.

>
> > @@ -1851,13 +1849,10 @@ ngx_http_process_user_agent(ngx_http_req
> > {
> > u_char *user_agent, *msie;
> >
> > - if (r->headers_in.user_agent) {
> > - return NGX_OK;
> > + if (ngx_http_process_header_line(r, h, offset) != NGX_OK) {
> > + return NGX_ERROR;
> > }
> >
> > - r->headers_in.user_agent = h;
> > - h->next = NULL;
> > -
> > /* check some widespread browsers while the header is in CPU cache */
> >
> > user_agent = h->value.data;
> > @@ -1919,23 +1914,6 @@ ngx_http_process_user_agent(ngx_http_req
> > }
> >
> >
> > -static ngx_int_t
> > -ngx_http_process_multi_header_lines(ngx_http_request_t *r, ngx_table_elt_t *h,
> > - ngx_uint_t offset)
> > -{
> > - ngx_table_elt_t **ph;
> > -
> > - ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);
> > -
> > - while (*ph) { ph = &(*ph)->next; }
> > -
> > - *ph = h;
> > - h->next = NULL;
> > -
> > - return NGX_OK;
> > -}
> > -
> > -
> > ngx_int_t
> > ngx_http_process_request_header(ngx_http_request_t *r)
> > {
> > diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c
> > --- a/src/http/ngx_http_variables.c
> > +++ b/src/http/ngx_http_variables.c
> > @@ -27,8 +27,6 @@ static ngx_int_t ngx_http_variable_heade
> >
> > static ngx_int_t ngx_http_variable_cookies(ngx_http_request_t *r,
> > ngx_http_variable_value_t *v, uintptr_t data);
> > -static ngx_int_t ngx_http_variable_headers(ngx_http_request_t *r,
> > - ngx_http_variable_value_t *v, uintptr_t data);
> > static ngx_int_t ngx_http_variable_headers_internal(ngx_http_request_t *r,
> > ngx_http_variable_value_t *v, uintptr_t data, u_char sep);
> >
> > @@ -178,7 +176,7 @@ static ngx_http_variable_t ngx_http_cor
> > #endif
> >
> > #if (NGX_HTTP_X_FORWARDED_FOR)
> > - { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_headers,
> > + { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_header,
> > offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 },
> > #endif
> >
> > @@ -327,10 +325,10 @@ static ngx_http_variable_t ngx_http_cor
> > { ngx_string("sent_http_transfer_encoding"), NULL,
> > ngx_http_variable_sent_transfer_encoding, 0, 0, 0 },
> >
> > - { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_headers,
> > + { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_header,
> > offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 },
> >
> > - { ngx_string("sent_http_link"), NULL, ngx_http_variable_headers,
> > + { ngx_string("sent_http_link"), NULL, ngx_http_variable_header,
> > offsetof(ngx_http_request_t, headers_out.link), 0, 0 },
> >
> > { ngx_string("limit_rate"), ngx_http_variable_set_limit_rate,
> > @@ -807,22 +805,7 @@ static ngx_int_t
> > ngx_http_variable_header(ngx_http_request_t *r, ngx_http_variable_value_t *v,
> > uintptr_t data)
> > {
> > - ngx_table_elt_t *h;
> > -
> > - h = *(ngx_table_elt_t **) ((char *) r + data);
> > -
> > - if (h) {
> > - v->len = h->value.len;
> > - v->valid = 1;
> > - v->no_cacheable = 0;
> > - v->not_found = 0;
> > - v->data = h->value.data;
> > -
> > - } else {
> > - v->not_found = 1;
> > - }
> > -
> > - return NGX_OK;
> > + return ngx_http_variable_headers_internal(r, v, data, ',');
> > }
> >
> >
> > @@ -835,14 +818,6 @@ ngx_http_variable_cookies(ngx_http_reque
> >
> >
> > static ngx_int_t
> > -ngx_http_variable_headers(ngx_http_request_t *r,
> > - ngx_http_variable_value_t *v, uintptr_t data)
> > -{
> > - return ngx_http_variable_headers_internal(r, v, data, ',');
> > -}
> > -
> > -
> > -static ngx_int_t
> > ngx_http_variable_headers_internal(ngx_http_request_t *r,
> > ngx_http_variable_value_t *v, uintptr_t data, u_char sep)
> > {
> >
> _______________________________________________
> nginx-devel mailing list -- nginx-devel@nginx.org
> To unsubscribe send an email to nginx-devel-leave@nginx.org

--
Maxim Dounin
http://mdounin.ru/
_______________________________________________
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 864 April 20, 2022 06:38PM

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

Maxim Dounin 181 April 20, 2022 06:40PM

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

Maxim Dounin 145 April 20, 2022 06:42PM

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

Sergey Kandaurov 186 May 11, 2022 11:36AM

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

Maxim Dounin 100 May 12, 2022 06:34PM

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

Sergey Kandaurov 214 May 13, 2022 10:06AM

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

Sergey Kandaurov 101 May 13, 2022 10:06AM

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

Maxim Dounin 148 April 20, 2022 06:44PM

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

Maxim Dounin 223 April 20, 2022 06:44PM

[PATCH 10 of 20] Upstream: style

Maxim Dounin 191 April 20, 2022 06:46PM

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

Maxim Dounin 271 April 20, 2022 06:48PM

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

Sergey Kandaurov 243 May 11, 2022 03:44PM

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

Maxim Dounin 93 May 12, 2022 07:56PM

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

Maxim Dounin 128 April 20, 2022 06:50PM

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

Maxim Dounin 297 April 20, 2022 06:52PM

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

Maxim Dounin 177 April 20, 2022 06:54PM

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

Sergey Kandaurov 141 May 11, 2022 04:02PM

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

Maxim Dounin 129 May 12, 2022 08:20PM

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

Maxim Dounin 123 April 20, 2022 06:56PM

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

Sergey Kandaurov 158 May 11, 2022 12:12PM

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

Maxim Dounin 217 May 12, 2022 07:18PM

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

Maxim Dounin 191 April 20, 2022 06:58PM

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

Sergey Kandaurov 130 May 11, 2022 03:24PM

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

Maxim Dounin 122 May 12, 2022 07:44PM

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

Sergey Kandaurov 274 June 13, 2022 01:08PM

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

Maxim Dounin 127 June 13, 2022 06:52PM

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

Maxim Dounin 182 April 20, 2022 07:00PM

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

Maxim Dounin 120 April 20, 2022 07:02PM

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

Maxim Dounin 112 April 20, 2022 07:04PM

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

Sergey Kandaurov 108 May 11, 2022 04:30PM

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

Maxim Dounin 129 May 12, 2022 08:26PM

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

Maxim Dounin 150 April 20, 2022 07:06PM

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

Sergey Kandaurov 132 May 11, 2022 04:48PM

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

Maxim Dounin 100 May 12, 2022 08:52PM

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

Maxim Dounin 119 April 20, 2022 07:08PM

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

Sergey Kandaurov 137 May 11, 2022 05:06PM

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

Maxim Dounin 102 May 12, 2022 10:00PM

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

Sergey Kandaurov 107 May 20, 2022 09:56AM

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

Maxim Dounin 113 May 20, 2022 05:10PM

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

Maxim Dounin 156 April 20, 2022 07:10PM

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

Sergey Kandaurov 104 May 11, 2022 04:36PM

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

Maxim Dounin 438 May 12, 2022 08:36PM

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

Maxim Dounin 145 April 20, 2022 07:12PM

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

Maxim Dounin 170 April 20, 2022 07:14PM

[PATCH 00 of 10] multiple headers tests

Maxim Dounin 157 April 20, 2022 07:16PM

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

Maxim Dounin 123 April 20, 2022 07:18PM

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

Maxim Dounin 176 April 20, 2022 07:20PM

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

Maxim Dounin 124 April 20, 2022 07:20PM

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

Maxim Dounin 93 April 20, 2022 07:22PM

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

Maxim Dounin 111 April 20, 2022 07:24PM

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

Maxim Dounin 114 April 20, 2022 07:26PM

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

Maxim Dounin 114 April 20, 2022 07:28PM

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

Maxim Dounin 167 April 20, 2022 07:30PM

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

Maxim Dounin 123 April 20, 2022 07:32PM

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

Maxim Dounin 136 April 20, 2022 07:34PM

Re: [PATCH 00 of 10] multiple headers tests

Sergey Kandaurov 150 May 31, 2022 07:14PM

Re: [PATCH 00 of 10] multiple headers tests

Maxim Dounin 96 June 03, 2022 07:26PM



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

Online Users

Guests: 297
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