[PATCH 06 of 20] Reworked multi headers to use linked lists
Sergey Kandaurov
pluknet at nginx.com
Mon Jun 13 17:04:24 UTC 2022
> On 21 Apr 2022, at 02:18, Maxim Dounin <mdounin at mdounin.ru> wrote:
>
> # HG changeset patch
> # User Maxim Dounin <mdounin at 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).
>
> 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/perl/nginx.xs b/src/http/modules/perl/nginx.xs
> --- a/src/http/modules/perl/nginx.xs
> +++ b/src/http/modules/perl/nginx.xs
> @@ -302,7 +302,7 @@ header_in(r, key)
>
> if (hh) {
>
> - if (hh->offset == offsetof(ngx_http_headers_in_t, cookies)) {
> + if (hh->offset == offsetof(ngx_http_headers_in_t, cookie)) {
> sep = ';';
> goto multi;
> }
> @@ -327,17 +327,13 @@ header_in(r, key)
>
> /* Cookie, X-Forwarded-For */
>
> - a = (ngx_array_t *) ((char *) &r->headers_in + hh->offset);
> + ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset);
>
> - n = a->nelts;
> -
> - if (n == 0) {
> + if (*ph == NULL) {
> XSRETURN_UNDEF;
> }
>
> - ph = a->elts;
> -
> - if (n == 1) {
> + if ((*ph)->next == NULL) {
> ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len);
>
> goto done;
> @@ -345,8 +341,8 @@ header_in(r, key)
>
> size = - (ssize_t) (sizeof("; ") - 1);
>
> - for (i = 0; i < n; i++) {
> - size += ph[i]->value.len + sizeof("; ") - 1;
> + for (h = *ph; h; h = h->next) {
> + size += h->value.len + sizeof("; ") - 1;
> }
>
> value = ngx_pnalloc(r->pool, size);
> @@ -357,10 +353,10 @@ header_in(r, key)
>
> p = value;
>
> - for (i = 0; /* void */ ; i++) {
> - p = ngx_copy(p, ph[i]->value.data, ph[i]->value.len);
> + for (h = *ph; h; h = h->next) {
> + p = ngx_copy(p, h->value.data, h->value.len);
>
> - if (i == n - 1) {
> + if (h->next == NULL) {
> break;
> }
> [...]
A follow-up I would like to commit.
It is caught on distributions that have -Wall in Perl's config_args:
nginx.xs:273:33: warning: unused variable āaā [-Wunused-variable]
nginx.xs:272:36: warning: unused variable ānā [-Wunused-variable]
# HG changeset patch
# User Sergey Kandaurov <pluknet at nginx.com>
# Date 1655137187 -14400
# Mon Jun 13 20:19:47 2022 +0400
# Node ID f1d335894234ea518f4b6d7064fc3aeba89706cc
# Parent aa28c802409fb7a74e3323195f859d09fe73cd6d
Perl: removed unused variables, forgotten in ef6a3a99a81a.
diff --git a/src/http/modules/perl/nginx.xs b/src/http/modules/perl/nginx.xs
--- a/src/http/modules/perl/nginx.xs
+++ b/src/http/modules/perl/nginx.xs
@@ -269,8 +269,7 @@ header_in(r, key)
u_char *p, *lowcase_key, *value, sep;
STRLEN len;
ssize_t size;
- ngx_uint_t i, n, hash;
- ngx_array_t *a;
+ ngx_uint_t i, hash;
ngx_list_part_t *part;
ngx_table_elt_t *h, *header, **ph;
ngx_http_header_t *hh;
--
Sergey Kandaurov
More information about the nginx-devel
mailing list