From bbd6face140707ff899e27dcb096cdca5629f72a Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sat, 28 Nov 2020 21:27:53 +0000 Subject: [PATCH] Fix bug #69625: FPM returns 200 status on request without SCRIPT_FILENAME --- sapi/fpm/fpm/fpm_main.c | 3 +- .../tests/bug69625-no-script-filename.phpt | 45 +++++++++++++++++++ sapi/fpm/tests/response.inc | 28 ++++++++++++ sapi/fpm/tests/tester.inc | 4 ++ 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 sapi/fpm/tests/bug69625-no-script-filename.phpt diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 839ed57eaaccc..8e0a8044e86fe 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -973,7 +973,7 @@ static void init_request_info(void) /* initialize the defaults */ SG(request_info).path_translated = NULL; - SG(request_info).request_method = NULL; + SG(request_info).request_method = FCGI_GETENV(request, "REQUEST_METHOD"); SG(request_info).proto_num = 1000; SG(request_info).query_string = NULL; SG(request_info).request_uri = NULL; @@ -1314,7 +1314,6 @@ static void init_request_info(void) SG(request_info).path_translated = estrdup(script_path_translated); } - SG(request_info).request_method = FCGI_GETENV(request, "REQUEST_METHOD"); /* FIXME - Work out proto_num here */ SG(request_info).query_string = FCGI_GETENV(request, "QUERY_STRING"); SG(request_info).content_type = (content_type ? content_type : "" ); diff --git a/sapi/fpm/tests/bug69625-no-script-filename.phpt b/sapi/fpm/tests/bug69625-no-script-filename.phpt new file mode 100644 index 0000000000000..9c6478dcf0cc0 --- /dev/null +++ b/sapi/fpm/tests/bug69625-no-script-filename.phpt @@ -0,0 +1,45 @@ +--TEST-- +FPM: bug69625 - 404 should be returned on missing SCRIPT_FILENAME +--SKIPIF-- + +--FILE-- +start(); +$tester->expectLogStartNotices(); +$tester + ->request('', ['SCRIPT_FILENAME' => null]) + ->expectHeader('Status', '404 Not Found') + ->expectError('Primary script unknown'); +$tester->terminate(); +$tester->close(); + +?> +Done +--EXPECT-- +Done +--CLEAN-- + diff --git a/sapi/fpm/tests/response.inc b/sapi/fpm/tests/response.inc index 54f85bcfb6062..7ee9cd46403ac 100644 --- a/sapi/fpm/tests/response.inc +++ b/sapi/fpm/tests/response.inc @@ -98,6 +98,34 @@ class Response return $this->expectBody(''); } + /** + * @param string $name + * @param string $value + * @return Response + */ + public function expectHeader($name, $value) + { + $this->checkHeader($name, $value); + + return $this; + } + + /** + * @param string $errorMessage + * @return Response + */ + public function expectError($errorMessage) + { + $errorData = $this->getErrorData(); + if ($errorData !== $errorMessage) { + $this->error( + "The expected error message '$errorMessage' is not equal to returned error '$errorData'" + ); + } + + return $this; + } + /** * @param string $contentType * @return string|null diff --git a/sapi/fpm/tests/tester.inc b/sapi/fpm/tests/tester.inc index da5719b0648b2..5c57652d8843f 100644 --- a/sapi/fpm/tests/tester.inc +++ b/sapi/fpm/tests/tester.inc @@ -564,6 +564,10 @@ class Tester ], $headers ); + $params = array_filter($params, function($value) { + return !is_null($value); + }); + try { $this->response = new Response( $this->getClient($address, $connKeepAlive)->request_data($params, false)