[nginx] Upstream: multiple WWW-Authenticate headers (ticket #485).
Sergey Kandaurov
pluknet at nginx.com
Mon May 30 22:32:59 UTC 2022
details: https://hg.nginx.org/nginx/rev/f739c8142fb2
branches:
changeset: 8036:f739c8142fb2
user: Maxim Dounin <mdounin at mdounin.ru>
date: Mon May 30 21:25:53 2022 +0300
description:
Upstream: multiple WWW-Authenticate headers (ticket #485).
When using proxy_intercept_errors and an error page for error 401
(Unauthorized), multiple WWW-Authenticate headers from the upstream server
response are now properly copied to the response.
diffstat:
src/http/ngx_http_upstream.c | 30 +++++++++++++++++++-----------
1 files changed, 19 insertions(+), 11 deletions(-)
diffs (49 lines):
diff -r cd73509f21e2 -r f739c8142fb2 src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c Mon May 30 21:25:51 2022 +0300
+++ b/src/http/ngx_http_upstream.c Mon May 30 21:25:53 2022 +0300
@@ -2647,7 +2647,7 @@ ngx_http_upstream_intercept_errors(ngx_h
{
ngx_int_t status;
ngx_uint_t i;
- ngx_table_elt_t *h;
+ ngx_table_elt_t *h, *ho, **ph;
ngx_http_err_page_t *err_page;
ngx_http_core_loc_conf_t *clcf;
@@ -2676,18 +2676,26 @@ ngx_http_upstream_intercept_errors(ngx_h
if (status == NGX_HTTP_UNAUTHORIZED
&& u->headers_in.www_authenticate)
{
- h = ngx_list_push(&r->headers_out.headers);
-
- if (h == NULL) {
- ngx_http_upstream_finalize_request(r, u,
+ h = u->headers_in.www_authenticate;
+ ph = &r->headers_out.www_authenticate;
+
+ while (h) {
+ ho = ngx_list_push(&r->headers_out.headers);
+
+ if (ho == NULL) {
+ ngx_http_upstream_finalize_request(r, u,
NGX_HTTP_INTERNAL_SERVER_ERROR);
- return NGX_OK;
+ return NGX_OK;
+ }
+
+ *ho = *h;
+ ho->next = NULL;
+
+ *ph = ho;
+ ph = &ho->next;
+
+ h = h->next;
}
-
- *h = *u->headers_in.www_authenticate;
- h->next = NULL;
-
- r->headers_out.www_authenticate = h;
}
#if (NGX_HTTP_CACHE)
More information about the nginx-devel
mailing list