Welcome! Log In Create A New Profile

Advanced

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

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

>
> 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.

[..]
_______________________________________________
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 124 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 183 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 439 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 124 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 94 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: 309
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