]> git.kaiwu.me - nginx.git/commitdiff
Upstream: fixed handling of Status headers without reason-phrase.
authorMaxim Dounin <mdounin@mdounin.ru>
Thu, 31 Aug 2023 19:59:17 +0000 (22:59 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Thu, 31 Aug 2023 19:59:17 +0000 (22:59 +0300)
Status header with an empty reason-phrase, such as "Status: 404 ", is
valid per CGI specification, but looses the trailing space during parsing.
Currently, this results in "HTTP/1.1 404" HTTP status line in the response,
which violates HTTP specification due to missing trailing space.

With this change, only the status code is used from such short Status
header lines, so nginx will generate status line itself, with the space
and appropriate reason phrase if available.

Reported at:
https://mailman.nginx.org/pipermail/nginx/2023-August/EX7G4JUUHJWJE5UOAZMO5UD6OJILCYGX.html

src/http/modules/ngx_http_fastcgi_module.c
src/http/modules/ngx_http_scgi_module.c
src/http/modules/ngx_http_uwsgi_module.c

index 2d9a18f905f3001926a24bfabc84cbcbd3f4bc7e..b9890833d98b9be8248b9b10debf453ce6a0ec27 100644 (file)
@@ -2048,7 +2048,10 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
                     }
 
                     u->headers_in.status_n = status;
-                    u->headers_in.status_line = *status_line;
+
+                    if (status_line->len > 3) {
+                        u->headers_in.status_line = *status_line;
+                    }
 
                 } else if (u->headers_in.location) {
                     u->headers_in.status_n = 302;
index 9fc18dcd30b41ed642b4a87b241dd6c17b819960..3acea87b764e98d510f2df18a36119971edbf9b0 100644 (file)
@@ -1153,7 +1153,10 @@ ngx_http_scgi_process_header(ngx_http_request_t *r)
                 }
 
                 u->headers_in.status_n = status;
-                u->headers_in.status_line = *status_line;
+
+                if (status_line->len > 3) {
+                    u->headers_in.status_line = *status_line;
+                }
 
             } else if (u->headers_in.location) {
                 u->headers_in.status_n = 302;
index e4f721bb026387da42d8eb34f072bbf1ef83abdd..c1731ff484c3f6aad0e2ee9260c157ed9a0b8fde 100644 (file)
@@ -1381,7 +1381,10 @@ ngx_http_uwsgi_process_header(ngx_http_request_t *r)
                 }
 
                 u->headers_in.status_n = status;
-                u->headers_in.status_line = *status_line;
+
+                if (status_line->len > 3) {
+                    u->headers_in.status_line = *status_line;
+                }
 
             } else if (u->headers_in.location) {
                 u->headers_in.status_n = 302;