[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