[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