Skip to content

Commit b6d167c

Browse files
authored
bugfix: update handling of multiple headers changed in nginx 1.23.0 (#2063)
1 parent c8597ed commit b6d167c

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

src/ngx_http_lua_headers_in.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,15 @@ static ngx_http_lua_set_header_t ngx_http_lua_set_handlers[] = {
152152
ngx_http_set_builtin_header },
153153
#endif
154154

155+
#if defined(nginx_version) && nginx_version >= 1023000
156+
{ ngx_string("Cookie"),
157+
offsetof(ngx_http_headers_in_t, cookie),
158+
ngx_http_set_builtin_multi_header },
159+
#else
155160
{ ngx_string("Cookie"),
156161
offsetof(ngx_http_headers_in_t, cookies),
157162
ngx_http_set_builtin_multi_header },
163+
#endif
158164

159165
{ ngx_null_string, 0, ngx_http_set_header }
160166
};
@@ -580,6 +586,45 @@ static ngx_int_t
580586
ngx_http_set_builtin_multi_header(ngx_http_request_t *r,
581587
ngx_http_lua_header_val_t *hv, ngx_str_t *value)
582588
{
589+
#if defined(nginx_version) && nginx_version >= 1023000
590+
ngx_table_elt_t **headers, **ph, *h;
591+
int nelts;
592+
593+
headers = (ngx_table_elt_t **) ((char *) &r->headers_in + hv->offset);
594+
595+
if (!hv->no_override && *headers != NULL) {
596+
nelts = 0;
597+
for (h = *headers; h; h = h->next) {
598+
nelts++;
599+
}
600+
601+
*headers = NULL;
602+
603+
dd("clear multi-value headers: %d", nelts);
604+
}
605+
606+
if (ngx_http_set_header_helper(r, hv, value, &h) == NGX_ERROR) {
607+
return NGX_ERROR;
608+
}
609+
610+
if (value->len == 0) {
611+
return NGX_OK;
612+
}
613+
614+
dd("new multi-value header: %p", h);
615+
616+
if (*headers) {
617+
for (ph = headers; *ph; ph = &(*ph)->next) { /* void */ }
618+
*ph = h;
619+
620+
} else {
621+
*headers = h;
622+
}
623+
624+
h->next = NULL;
625+
626+
return NGX_OK;
627+
#else
583628
ngx_array_t *headers;
584629
ngx_table_elt_t **v, *h;
585630

@@ -626,6 +671,7 @@ ngx_http_set_builtin_multi_header(ngx_http_request_t *r,
626671

627672
*v = h;
628673
return NGX_OK;
674+
#endif
629675
}
630676

631677

src/ngx_http_lua_headers_out.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,69 @@ static ngx_int_t
311311
ngx_http_set_builtin_multi_header(ngx_http_request_t *r,
312312
ngx_http_lua_header_val_t *hv, ngx_str_t *value)
313313
{
314+
#if defined(nginx_version) && nginx_version >= 1023000
315+
ngx_table_elt_t **headers, *h, *ho, **ph;
316+
317+
headers = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);
318+
319+
if (hv->no_override) {
320+
for (h = *headers; h; h = h->next) {
321+
if (!h->hash) {
322+
h->value = *value;
323+
h->hash = hv->hash;
324+
return NGX_OK;
325+
}
326+
}
327+
328+
goto create;
329+
}
330+
331+
/* override old values (if any) */
332+
333+
if (*headers) {
334+
for (h = (*headers)->next; h; h = h->next) {
335+
h->hash = 0;
336+
h->value.len = 0;
337+
}
338+
339+
h = *headers;
340+
341+
h->value = *value;
342+
343+
if (value->len == 0) {
344+
h->hash = 0;
345+
346+
} else {
347+
h->hash = hv->hash;
348+
}
349+
350+
return NGX_OK;
351+
}
352+
353+
create:
354+
355+
for (ph = headers; *ph; ph = &(*ph)->next) { /* void */ }
356+
357+
ho = ngx_list_push(&r->headers_out.headers);
358+
if (ho == NULL) {
359+
return NGX_ERROR;
360+
}
361+
362+
ho->value = *value;
363+
364+
if (value->len == 0) {
365+
ho->hash = 0;
366+
367+
} else {
368+
ho->hash = hv->hash;
369+
}
370+
371+
ho->key = hv->key;
372+
ho->next = NULL;
373+
*ph = ho;
374+
375+
return NGX_OK;
376+
#else
314377
ngx_array_t *pa;
315378
ngx_table_elt_t *ho, **ph;
316379
ngx_uint_t i;
@@ -384,6 +447,7 @@ ngx_http_set_builtin_multi_header(ngx_http_request_t *r,
384447
*ph = ho;
385448

386449
return NGX_OK;
450+
#endif
387451
}
388452

389453

0 commit comments

Comments
 (0)