aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2023-08-31 22:59:17 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2023-08-31 22:59:17 +0300
commitfa46a5719924a5a4c48c515a903e0c46a4d98bcf (patch)
treeef1c58e98843913554aaf867e1be2bd6217120fb /src
parentba30ff4c8de1ac8c79a12da50ef94e5d9f99fa66 (diff)
downloadnginx-fa46a5719924a5a4c48c515a903e0c46a4d98bcf.tar.gz
nginx-fa46a5719924a5a4c48c515a903e0c46a4d98bcf.zip
Upstream: fixed handling of Status headers without reason-phrase.
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
Diffstat (limited to 'src')
-rw-r--r--src/http/modules/ngx_http_fastcgi_module.c5
-rw-r--r--src/http/modules/ngx_http_scgi_module.c5
-rw-r--r--src/http/modules/ngx_http_uwsgi_module.c5
3 files changed, 12 insertions, 3 deletions
diff --git a/src/http/modules/ngx_http_fastcgi_module.c b/src/http/modules/ngx_http_fastcgi_module.c
index 2d9a18f90..b9890833d 100644
--- a/src/http/modules/ngx_http_fastcgi_module.c
+++ b/src/http/modules/ngx_http_fastcgi_module.c
@@ -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;
diff --git a/src/http/modules/ngx_http_scgi_module.c b/src/http/modules/ngx_http_scgi_module.c
index 9fc18dcd3..3acea87b7 100644
--- a/src/http/modules/ngx_http_scgi_module.c
+++ b/src/http/modules/ngx_http_scgi_module.c
@@ -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;
diff --git a/src/http/modules/ngx_http_uwsgi_module.c b/src/http/modules/ngx_http_uwsgi_module.c
index e4f721bb0..c1731ff48 100644
--- a/src/http/modules/ngx_http_uwsgi_module.c
+++ b/src/http/modules/ngx_http_uwsgi_module.c
@@ -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;