Welcome! Log In Create A New Profile

Advanced

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

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

On Wed, May 11, 2022 at 11:21:15PM +0400, Sergey Kandaurov wrote:

> On Thu, Apr 21, 2022 at 01:18:46AM +0300, Maxim Dounin wrote:
> > # HG changeset patch
> > # User Maxim Dounin <mdounin@mdounin.ru>
> > # Date 1650492323 -10800
> > # Thu Apr 21 01:05:23 2022 +0300
> > # Node ID 50fe52f516ff9c148aa9e7dfcc1c31cc6a4929ae
> > # Parent 2ea48b5e4643a818cd81179f040f0b36be9050d6
> > Reworked multi headers to use linked lists.
> >
> > Multi headers are now using linked lists instead of arrays. Notably,
> > the following fields were changed: r->headers_in.cookies (renamed
> > to r->headers_in.cookie), r->headers_in.x_forwarded_for,
> > r->headers_out.cache_control, r->headers_out.link, u->headers_in.cache_control
> > u->headers_in.cookies (renamed to u->headers_in.set_cookie).
>
> jftr, this implies updating a bunch of 3rd party modules, including njs, lua,
> naxsi, nginx-clojure, headers-more, geoip2_module, ngx_http_sticky_module

Sure.

> >
> > The r->headers_in.cookies and u->headers_in.cookies fields were renamed
> > to r->headers_in.cookie and u->headers_in.set_cookie to match header names.
> >
> > The ngx_http_parse_multi_header_lines() and ngx_http_parse_set_cookie_lines()
> > functions were changed accordingly.
> >
> > With this change, multi headers are now essentially equivalent to normal
> > headers, and following changes will further make them equivalent.
> >
> > diff --git a/src/http/modules/ngx_http_geo_module.c b/src/http/modules/ngx_http_geo_module.c
> > --- a/src/http/modules/ngx_http_geo_module.c
> > +++ b/src/http/modules/ngx_http_geo_module.c
> > @@ -327,15 +327,15 @@ static ngx_int_t
> > ngx_http_geo_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx,
> > ngx_addr_t *addr)
> > {
> > - ngx_array_t *xfwd;
> > + ngx_table_elt_t *xfwd;
> >
> > if (ngx_http_geo_real_addr(r, ctx, addr) != NGX_OK) {
> > return NGX_ERROR;
> > }
> >
> > - xfwd = &r->headers_in.x_forwarded_for;
> > + xfwd = r->headers_in.x_forwarded_for;
> >
> > - if (xfwd->nelts > 0 && ctx->proxies != NULL) {
> > + if (xfwd != NULL && ctx->proxies != NULL) {
> > (void) ngx_http_get_forwarded_addr(r, addr, xfwd, NULL,
> > ctx->proxies, ctx->proxy_recursive);
> > }
> > diff --git a/src/http/modules/ngx_http_geoip_module.c b/src/http/modules/ngx_http_geoip_module.c
> > --- a/src/http/modules/ngx_http_geoip_module.c
> > +++ b/src/http/modules/ngx_http_geoip_module.c
> > @@ -240,16 +240,16 @@ static u_long
> > ngx_http_geoip_addr(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf)
> > {
> > ngx_addr_t addr;
> > - ngx_array_t *xfwd;
> > + ngx_table_elt_t *xfwd;
> > struct sockaddr_in *sin;
> >
> > addr.sockaddr = r->connection->sockaddr;
> > addr.socklen = r->connection->socklen;
> > /* addr.name = r->connection->addr_text; */
> >
> > - xfwd = &r->headers_in.x_forwarded_for;
> > + xfwd = r->headers_in.x_forwarded_for;
> >
> > - if (xfwd->nelts > 0 && gcf->proxies != NULL) {
> > + if (xfwd != NULL && gcf->proxies != NULL) {
> > (void) ngx_http_get_forwarded_addr(r, &addr, xfwd, NULL,
> > gcf->proxies, gcf->proxy_recursive);
> > }
> > @@ -292,7 +292,7 @@ static geoipv6_t
> > ngx_http_geoip_addr_v6(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf)
> > {
> > ngx_addr_t addr;
> > - ngx_array_t *xfwd;
> > + ngx_table_elt_t *xfwd;
> > in_addr_t addr4;
> > struct in6_addr addr6;
> > struct sockaddr_in *sin;
> > @@ -302,9 +302,9 @@ ngx_http_geoip_addr_v6(ngx_http_request_
> > addr.socklen = r->connection->socklen;
> > /* addr.name = r->connection->addr_text; */
> >
> > - xfwd = &r->headers_in.x_forwarded_for;
> > + xfwd = r->headers_in.x_forwarded_for;
> >
> > - if (xfwd->nelts > 0 && gcf->proxies != NULL) {
> > + if (xfwd != NULL && gcf->proxies != NULL) {
> > (void) ngx_http_get_forwarded_addr(r, &addr, xfwd, NULL,
> > gcf->proxies, gcf->proxy_recursive);
> > }
> > diff --git a/src/http/modules/ngx_http_headers_filter_module.c b/src/http/modules/ngx_http_headers_filter_module.c
> > --- a/src/http/modules/ngx_http_headers_filter_module.c
> > +++ b/src/http/modules/ngx_http_headers_filter_module.c
> > @@ -329,8 +329,7 @@ ngx_http_set_expires(ngx_http_request_t
> > time_t now, expires_time, max_age;
> > ngx_str_t value;
> > ngx_int_t rc;
> > - ngx_uint_t i;
> > - ngx_table_elt_t *e, *cc, **ccp;
> > + ngx_table_elt_t *e, *cc;
> > ngx_http_expires_t expires;
> >
> > expires = conf->expires;
> > @@ -371,38 +370,28 @@ ngx_http_set_expires(ngx_http_request_t
> > len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT");
> > e->value.len = len - 1;
> >
> > - ccp = r->headers_out.cache_control.elts;
> > -
> > - if (ccp == NULL) {
> > + cc = r->headers_out.cache_control;
> >
> > - if (ngx_array_init(&r->headers_out.cache_control, r->pool,
> > - 1, sizeof(ngx_table_elt_t *))
> > - != NGX_OK)
> > - {
> > - return NGX_ERROR;
> > - }
> > + if (cc == NULL) {
> >
> > cc = ngx_list_push(&r->headers_out.headers);
> > if (cc == NULL) {
> > return NGX_ERROR;
> > }
> >
> > + r->headers_out.cache_control = cc;
> > + cc->next = NULL;
> > +
> > cc->hash = 1;
> > ngx_str_set(&cc->key, "Cache-Control");
> >
> > - ccp = ngx_array_push(&r->headers_out.cache_control);
> > - if (ccp == NULL) {
> > - return NGX_ERROR;
> > + } else {
> > + for (cc = cc->next; cc; cc = cc->next) {
> > + cc->hash = 0;
> > }
> >
> > - *ccp = cc;
> > -
> > - } else {
> > - for (i = 1; i < r->headers_out.cache_control.nelts; i++) {
> > - ccp[i]->hash = 0;
> > - }
> > -
> > - cc = ccp[0];
> > + cc = r->headers_out.cache_control;
> > + cc->next = NULL;
> > }
> >
> > if (expires == NGX_HTTP_EXPIRES_EPOCH) {
> > @@ -564,22 +553,12 @@ static ngx_int_t
> > ngx_http_add_multi_header_lines(ngx_http_request_t *r,
> > ngx_http_header_val_t *hv, ngx_str_t *value)
> > {
> > - ngx_array_t *pa;
> > ngx_table_elt_t *h, **ph;
> >
> > if (value->len == 0) {
> > return NGX_OK;
> > }
> >
> > - pa = (ngx_array_t *) ((char *) &r->headers_out + hv->offset);
> > -
> > - if (pa->elts == NULL) {
> > - if (ngx_array_init(pa, r->pool, 1, sizeof(ngx_table_elt_t *)) != NGX_OK)
> > - {
> > - return NGX_ERROR;
> > - }
> > - }
> > -
> > h = ngx_list_push(&r->headers_out.headers);
> > if (h == NULL) {
> > return NGX_ERROR;
> > @@ -589,12 +568,12 @@ ngx_http_add_multi_header_lines(ngx_http
> > h->key = hv->key;
> > h->value = *value;
> >
> > - ph = ngx_array_push(pa);
> > - if (ph == NULL) {
> > - return NGX_ERROR;
> > - }
> > + ph = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);
> > +
> > + while (*ph) { ph = &(*ph)->next; }
> >
> > *ph = h;
> > + h->next = NULL;
> >
> > return NGX_OK;
> > }
> > diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c
> > --- a/src/http/modules/ngx_http_proxy_module.c
> > +++ b/src/http/modules/ngx_http_proxy_module.c
> > @@ -2559,22 +2559,20 @@ static ngx_int_t
> > ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,
> > ngx_http_variable_value_t *v, uintptr_t data)
> > {
> > - size_t len;
> > - u_char *p;
> > - ngx_uint_t i, n;
> > - ngx_table_elt_t **h;
> > + size_t len;
> > + u_char *p;
> > + ngx_table_elt_t *h, *xfwd;
> >
> > v->valid = 1;
> > v->no_cacheable = 0;
> > v->not_found = 0;
> >
> > - n = r->headers_in.x_forwarded_for.nelts;
> > - h = r->headers_in.x_forwarded_for.elts;
> > + xfwd = r->headers_in.x_forwarded_for;
> >
> > len = 0;
> >
> > - for (i = 0; i < n; i++) {
> > - len += h[i]->value.len + sizeof(", ") - 1;
> > + for (h = xfwd; h; h = h->next) {
> > + len += h->value.len + sizeof(", ") - 1;
> > }
> >
> > if (len == 0) {
>
> The only minor point in a whole patch (which I won't insist):
> a special case for xfwd absense can be slightly reshuffled now
> to avoid a do-nothing loop.
>
> diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c
> --- a/src/http/modules/ngx_http_proxy_module.c
> +++ b/src/http/modules/ngx_http_proxy_module.c
> @@ -2569,18 +2569,18 @@ ngx_http_proxy_add_x_forwarded_for_varia
>
> xfwd = r->headers_in.x_forwarded_for;
>
> + if (xfwd == NULL) {
> + v->len = r->connection->addr_text.len;
> + v->data = r->connection->addr_text.data;
> + return NGX_OK;
> + }
> +
> len = 0;
>
> for (h = xfwd; h; h = h->next) {
> len += h->value.len + sizeof(", ") - 1;
> }
>
> - if (len == 0) {
> - v->len = r->connection->addr_text.len;
> - v->data = r->connection->addr_text.data;
> - return NGX_OK;
> - }
> -
> len += r->connection->addr_text.len;
>
> p = ngx_pnalloc(r->pool, len);
>
> Otherwise, looks good.

Such an optimization (if at all) is completely orthogonal and
available regardless of the r->headers_in.x_forwarded_for format
(that is, nothing stops you from testing "n == 0" in the original
code).

Either way, I don't think such a change belongs to this patch
and/or this patch series.

--
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 146 April 20, 2022 06:42PM

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

Sergey Kandaurov 187 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 244 May 11, 2022 03:44PM

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

Maxim Dounin 95 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 124 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 192 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 123 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 113 April 20, 2022 07:04PM

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

Sergey Kandaurov 109 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 138 May 11, 2022 05:06PM

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

Maxim Dounin 103 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 114 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 171 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 115 April 20, 2022 07:28PM

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

Maxim Dounin 168 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 137 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: 230
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