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

Maxim Dounin mdounin at mdounin.ru
Mon Jun 13 22:51:28 UTC 2022


Hello!

On Mon, Jun 13, 2022 at 09:04:24PM +0400, Sergey Kandaurov wrote:

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

Looks good.

-- 
Maxim Dounin
http://mdounin.ru/



More information about the nginx-devel mailing list