laruence Tue, 15 Nov 2011 03:15:19 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=319224
Log: Fixed bug #60159 (Router returns false, but POST is not passed to requested resource) and bug #55759 (mem leak when use built-in server) Bugs: https://bugs.php.net/60159 (Open) Router returns false, but POST is not passed to requested resource https://bugs.php.net/55759 (Assigned) mem leak when use built-in server Changed paths: U php/php-src/branches/PHP_5_4/NEWS U php/php-src/branches/PHP_5_4/sapi/cli/php_cli_server.c A php/php-src/branches/PHP_5_4/sapi/cli/tests/php_cli_server_012.phpt A php/php-src/branches/PHP_5_4/sapi/cli/tests/php_cli_server_013.phpt U php/php-src/trunk/sapi/cli/php_cli_server.c U php/php-src/trunk/sapi/cli/tests/php_cli_server.inc A php/php-src/trunk/sapi/cli/tests/php_cli_server_012.phpt A php/php-src/trunk/sapi/cli/tests/php_cli_server_013.phpt
Modified: php/php-src/branches/PHP_5_4/NEWS =================================================================== --- php/php-src/branches/PHP_5_4/NEWS 2011-11-15 01:53:16 UTC (rev 319223) +++ php/php-src/branches/PHP_5_4/NEWS 2011-11-15 03:15:19 UTC (rev 319224) @@ -19,6 +19,11 @@ . Fixed bug #60282 (Segfault when using ob_gzhandler() with open buffers). (Laruence) +-CLI SAPI: + . Fixed bug #60159 (Router returns false, but POST is not passed to requested + resource). (Laruence) + . Fixed bug #55759 (mem leak when use built-in server). (Laruence) + 11 Nov 2011, PHP 5.4.0 RC1 - General improvements: . Changed silent conversion of array to string to produce a notice. (Patrick) Modified: php/php-src/branches/PHP_5_4/sapi/cli/php_cli_server.c =================================================================== --- php/php-src/branches/PHP_5_4/sapi/cli/php_cli_server.c 2011-11-15 01:53:16 UTC (rev 319223) +++ php/php-src/branches/PHP_5_4/sapi/cli/php_cli_server.c 2011-11-15 03:15:19 UTC (rev 319224) @@ -1815,22 +1815,8 @@ static int php_cli_server_dispatch_script(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */ { - php_cli_server_client_populate_request_info(client, &SG(request_info)); - { - char **auth; - if (SUCCESS == zend_hash_find(&client->request.headers, "Authorization", sizeof("Authorization"), (void**)&auth)) { - php_handle_auth_data(*auth TSRMLS_CC); - } - } - SG(sapi_headers).http_response_code = 200; - if (FAILURE == php_request_startup(TSRMLS_C)) { - /* should never be happen */ - destroy_request_info(&SG(request_info)); - return FAILURE; - } if (strlen(client->request.path_translated) != client->request.path_translated_len) { /* can't handle paths that contain nul bytes */ - destroy_request_info(&SG(request_info)); return php_cli_server_send_error_page(server, client, 400 TSRMLS_CC); } { @@ -1846,9 +1832,6 @@ } php_cli_server_log_response(client, SG(sapi_headers).http_response_code, NULL TSRMLS_CC); - php_request_shutdown(0); - php_cli_server_close_connection(server, client TSRMLS_CC); - destroy_request_info(&SG(request_info)); return SUCCESS; } /* }}} */ @@ -1910,27 +1893,35 @@ } /* }}} */ -static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */ -{ - int decline = 0; - - if (!server->router) { - return 1; - } - +static int php_cli_server_request_startup(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) { /* {{{ */ + char **auth; php_cli_server_client_populate_request_info(client, &SG(request_info)); - { - char **auth; - if (SUCCESS == zend_hash_find(&client->request.headers, "Authorization", sizeof("Authorization"), (void**)&auth)) { - php_handle_auth_data(*auth TSRMLS_CC); - } + if (SUCCESS == zend_hash_find(&client->request.headers, "Authorization", sizeof("Authorization"), (void**)&auth)) { + php_handle_auth_data(*auth TSRMLS_CC); } SG(sapi_headers).http_response_code = 200; if (FAILURE == php_request_startup(TSRMLS_C)) { /* should never be happen */ destroy_request_info(&SG(request_info)); - return -1; + return FAILURE; } + + return SUCCESS; +} +/* }}} */ + +static int php_cli_server_request_shutdown(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) { /* {{{ */ + php_request_shutdown(0); + php_cli_server_close_connection(server, client TSRMLS_CC); + destroy_request_info(&SG(request_info)); + SG(server_context) = NULL; + return SUCCESS; +} +/* }}} */ + +static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */ +{ + int decline = 0; if (!php_handle_special_queries(TSRMLS_C)) { zend_file_handle zfd; char *old_cwd; @@ -1965,45 +1956,52 @@ free_alloca(old_cwd, use_heap); } - if (decline) { - php_request_shutdown_for_hook(0); - } else { - php_request_shutdown(0); - php_cli_server_close_connection(server, client TSRMLS_CC); - } - destroy_request_info(&SG(request_info)); - - return decline ? 1: 0; + return decline; } /* }}} */ static int php_cli_server_dispatch(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */ { - int status; + int is_static_file = 0; SG(server_context) = client; - status = php_cli_server_dispatch_router(server, client TSRMLS_CC); + if (client->request.ext_len != 3 || memcmp(client->request.ext, "php", 3) || !client->request.path_translated) { + is_static_file = 1; + } - if (status < 0) { - goto fail; - } else if (status > 0) { - if (client->request.ext_len == 3 && memcmp(client->request.ext, "php", 3) == 0 && client->request.path_translated) { - if (SUCCESS != php_cli_server_dispatch_script(server, client TSRMLS_CC) && - SUCCESS != php_cli_server_send_error_page(server, client, 500 TSRMLS_CC)) { - goto fail; - } - } else { - if (SUCCESS != php_cli_server_begin_send_static(server, client TSRMLS_CC)) { - goto fail; - } + if (server->router || !is_static_file) { + if (FAILURE == php_cli_server_request_startup(server, client TSRMLS_CC)) { + SG(server_context) = NULL; + php_cli_server_close_connection(server, client TSRMLS_CC); + destroy_request_info(&SG(request_info)); + return SUCCESS; } + } + + if (server->router) { + if (!php_cli_server_dispatch_router(server, client TSRMLS_CC)) { + php_cli_server_request_shutdown(server, client TSRMLS_CC); + return SUCCESS; + } } - SG(server_context) = 0; + + if (!is_static_file) { + if (SUCCESS == php_cli_server_dispatch_script(server, client TSRMLS_CC) + || SUCCESS != php_cli_server_send_error_page(server, client, 500 TSRMLS_CC)) { + php_cli_server_request_shutdown(server, client TSRMLS_CC); + return SUCCESS; + } + } else { + if (SUCCESS != php_cli_server_begin_send_static(server, client TSRMLS_CC)) { + php_cli_server_close_connection(server, client TSRMLS_CC); + } + SG(server_context) = NULL; + return SUCCESS; + } + + SG(server_context) = NULL; + destroy_request_info(&SG(request_info)); return SUCCESS; -fail: - SG(server_context) = 0; - php_cli_server_close_connection(server, client TSRMLS_CC); - return SUCCESS; } /* }}} */ Added: php/php-src/branches/PHP_5_4/sapi/cli/tests/php_cli_server_012.phpt =================================================================== --- php/php-src/branches/PHP_5_4/sapi/cli/tests/php_cli_server_012.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/sapi/cli/tests/php_cli_server_012.phpt 2011-11-15 03:15:19 UTC (rev 319224) @@ -0,0 +1,55 @@ +--TEST-- +Bug #60159 (Router returns false, but POST is not passed to requested resource) +--SKIPIF-- +<?php +include "skipif.inc"; +?> +--FILE-- +<?php +include "php_cli_server.inc"; +php_cli_server_start('print_r($_REQUEST); $_REQUEST["foo"] = "bar"; return FALSE;'); +$doc_root = __DIR__; +file_put_contents($doc_root . '/request.php', '<?php print_r($_REQUEST); ?>'); + +list($host, $port) = explode(':', PHP_CLI_SERVER_ADDRESS); +$port = intval($port)?:80; + +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +if(fwrite($fp, <<<HEADER +POST /request.php HTTP/1.1 +Host: {$host} +Content-Type: application/x-www-form-urlencoded +Content-Length: 3 + +a=b +HEADER +)) { + while (!feof($fp)) { + echo fgets($fp); + } +} + +fclose($fp); +@unlink($doc_root . '/request.php'); + +?> +--EXPECTF-- +HTTP/1.1 200 OK +Host: %s +Connection: closed +X-Powered-By: PHP/%s +Content-type: text/html + +Array +( + [a] => b +) +Array +( + [a] => b + [foo] => bar +) Added: php/php-src/branches/PHP_5_4/sapi/cli/tests/php_cli_server_013.phpt =================================================================== --- php/php-src/branches/PHP_5_4/sapi/cli/tests/php_cli_server_013.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/sapi/cli/tests/php_cli_server_013.phpt 2011-11-15 03:15:19 UTC (rev 319224) @@ -0,0 +1,108 @@ +--TEST-- +No router, no script +--SKIPIF-- +<?php +include "skipif.inc"; +?> +--FILE-- +<?php +include "php_cli_server.inc"; +php_cli_server_start(NULL, TRUE); + +list($host, $port) = explode(':', PHP_CLI_SERVER_ADDRESS); +$port = intval($port)?:80; +$output = ''; + +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + + +if(fwrite($fp, <<<HEADER +POST / HTTP/1.1 +Host: {$host} +Content-Type: application/x-www-form-urlencoded +Content-Length: 3 + +a=b +HEADER +)) { + while (!feof($fp)) { + $output .= fgets($fp); + } +} + +echo preg_replace("/<style type=\"text\/css\">(.*?)<\/style>/s", "<style type=\"text/css\">AAA</style>", $output), "\n"; +fclose($fp); + + +$output = ''; +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +if(fwrite($fp, <<<HEADER +GET /main/style.css HTTP/1.1 +Host: {$host} + + +HEADER +)) { + while (!feof($fp)) { + $output .= fgets($fp); + } +} + +echo preg_replace("/<style type=\"text\/css\">(.*?)<\/style>/s", "<style type=\"text/css\">AAA</style>", $output), "\n"; +fclose($fp); + +$output = ''; +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +if(fwrite($fp, <<<HEADER +HEAD /main/foo/bar HTTP/1.1 +Host: {$host} + + +HEADER +)) { + while (!feof($fp)) { + $output .= fgets($fp); + } +} + +echo preg_replace("/<style type=\"text\/css\">(.*?)<\/style>/s", "<style type=\"text/css\">AAA</style>", $output), "\n"; +fclose($fp); +?> +--EXPECTF-- + +HTTP/1.1 404 Not Found +Host: %s +Connection: closed +Content-Type: text/html; charset=UTF-8 +Content-Length: %d + +<html><head><title>404 Not Found</title><style type="text/css">AAA</style> +</head><body><h1 class="h">Not Found</h1><p>The requested resource / was not found on this server.</p></body></html> +HTTP/1.1 404 Not Found +Host: %s +Connection: closed +Content-Type: text/html; charset=UTF-8 +Content-Length: %d + +<html><head><title>404 Not Found</title><style type="text/css">AAA</style> +</head><body><h1 class="h">Not Found</h1><p>The requested resource /main/style.css was not found on this server.</p></body></html> +HTTP/1.1 404 Not Found +Host: %s +Connection: closed +Content-Type: text/html; charset=UTF-8 +Content-Length: %d + +<html><head><title>404 Not Found</title><style type="text/css">AAA</style> +</head><body><h1 class="h">Not Found</h1><p>The requested resource /main/foo/bar was not found on this server.</p></body></html> + Modified: php/php-src/trunk/sapi/cli/php_cli_server.c =================================================================== --- php/php-src/trunk/sapi/cli/php_cli_server.c 2011-11-15 01:53:16 UTC (rev 319223) +++ php/php-src/trunk/sapi/cli/php_cli_server.c 2011-11-15 03:15:19 UTC (rev 319224) @@ -1815,22 +1815,8 @@ static int php_cli_server_dispatch_script(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */ { - php_cli_server_client_populate_request_info(client, &SG(request_info)); - { - char **auth; - if (SUCCESS == zend_hash_find(&client->request.headers, "Authorization", sizeof("Authorization"), (void**)&auth)) { - php_handle_auth_data(*auth TSRMLS_CC); - } - } - SG(sapi_headers).http_response_code = 200; - if (FAILURE == php_request_startup(TSRMLS_C)) { - /* should never be happen */ - destroy_request_info(&SG(request_info)); - return FAILURE; - } if (strlen(client->request.path_translated) != client->request.path_translated_len) { /* can't handle paths that contain nul bytes */ - destroy_request_info(&SG(request_info)); return php_cli_server_send_error_page(server, client, 400 TSRMLS_CC); } { @@ -1846,9 +1832,6 @@ } php_cli_server_log_response(client, SG(sapi_headers).http_response_code, NULL TSRMLS_CC); - php_request_shutdown(0); - php_cli_server_close_connection(server, client TSRMLS_CC); - destroy_request_info(&SG(request_info)); return SUCCESS; } /* }}} */ @@ -1910,27 +1893,35 @@ } /* }}} */ -static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */ -{ - int decline = 0; - - if (!server->router) { - return 1; - } - +static int php_cli_server_request_startup(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) { /* {{{ */ + char **auth; php_cli_server_client_populate_request_info(client, &SG(request_info)); - { - char **auth; - if (SUCCESS == zend_hash_find(&client->request.headers, "Authorization", sizeof("Authorization"), (void**)&auth)) { - php_handle_auth_data(*auth TSRMLS_CC); - } + if (SUCCESS == zend_hash_find(&client->request.headers, "Authorization", sizeof("Authorization"), (void**)&auth)) { + php_handle_auth_data(*auth TSRMLS_CC); } SG(sapi_headers).http_response_code = 200; if (FAILURE == php_request_startup(TSRMLS_C)) { /* should never be happen */ destroy_request_info(&SG(request_info)); - return -1; + return FAILURE; } + + return SUCCESS; +} +/* }}} */ + +static int php_cli_server_request_shutdown(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) { /* {{{ */ + php_request_shutdown(0); + php_cli_server_close_connection(server, client TSRMLS_CC); + destroy_request_info(&SG(request_info)); + SG(server_context) = NULL; + return SUCCESS; +} +/* }}} */ + +static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */ +{ + int decline = 0; if (!php_handle_special_queries(TSRMLS_C)) { zend_file_handle zfd; char *old_cwd; @@ -1965,45 +1956,52 @@ free_alloca(old_cwd, use_heap); } - if (decline) { - php_request_shutdown_for_hook(0); - } else { - php_request_shutdown(0); - php_cli_server_close_connection(server, client TSRMLS_CC); - } - destroy_request_info(&SG(request_info)); - - return decline ? 1: 0; + return decline; } /* }}} */ static int php_cli_server_dispatch(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */ { - int status; + int is_static_file = 0; SG(server_context) = client; - status = php_cli_server_dispatch_router(server, client TSRMLS_CC); + if (client->request.ext_len != 3 || memcmp(client->request.ext, "php", 3) || !client->request.path_translated) { + is_static_file = 1; + } - if (status < 0) { - goto fail; - } else if (status > 0) { - if (client->request.ext_len == 3 && memcmp(client->request.ext, "php", 3) == 0 && client->request.path_translated) { - if (SUCCESS != php_cli_server_dispatch_script(server, client TSRMLS_CC) && - SUCCESS != php_cli_server_send_error_page(server, client, 500 TSRMLS_CC)) { - goto fail; - } - } else { - if (SUCCESS != php_cli_server_begin_send_static(server, client TSRMLS_CC)) { - goto fail; - } + if (server->router || !is_static_file) { + if (FAILURE == php_cli_server_request_startup(server, client TSRMLS_CC)) { + SG(server_context) = NULL; + php_cli_server_close_connection(server, client TSRMLS_CC); + destroy_request_info(&SG(request_info)); + return SUCCESS; } + } + + if (server->router) { + if (!php_cli_server_dispatch_router(server, client TSRMLS_CC)) { + php_cli_server_request_shutdown(server, client TSRMLS_CC); + return SUCCESS; + } } - SG(server_context) = 0; + + if (!is_static_file) { + if (SUCCESS == php_cli_server_dispatch_script(server, client TSRMLS_CC) + || SUCCESS != php_cli_server_send_error_page(server, client, 500 TSRMLS_CC)) { + php_cli_server_request_shutdown(server, client TSRMLS_CC); + return SUCCESS; + } + } else { + if (SUCCESS != php_cli_server_begin_send_static(server, client TSRMLS_CC)) { + php_cli_server_close_connection(server, client TSRMLS_CC); + } + SG(server_context) = NULL; + return SUCCESS; + } + + SG(server_context) = NULL; + destroy_request_info(&SG(request_info)); return SUCCESS; -fail: - SG(server_context) = 0; - php_cli_server_close_connection(server, client TSRMLS_CC); - return SUCCESS; } /* }}} */ Modified: php/php-src/trunk/sapi/cli/tests/php_cli_server.inc =================================================================== --- php/php-src/trunk/sapi/cli/tests/php_cli_server.inc 2011-11-15 01:53:16 UTC (rev 319223) +++ php/php-src/trunk/sapi/cli/tests/php_cli_server.inc 2011-11-15 03:15:19 UTC (rev 319224) @@ -5,7 +5,9 @@ $php_executable = getenv('TEST_PHP_EXECUTABLE'); $doc_root = __DIR__; $router = "index.php"; - file_put_contents($doc_root . '/' . $router, '<?php ' . $code . ' ?>'); + if ($code) { + file_put_contents($doc_root . '/' . $router, '<?php ' . $code . ' ?>'); + } $descriptorspec = array( 0 => STDIN, Added: php/php-src/trunk/sapi/cli/tests/php_cli_server_012.phpt =================================================================== --- php/php-src/trunk/sapi/cli/tests/php_cli_server_012.phpt (rev 0) +++ php/php-src/trunk/sapi/cli/tests/php_cli_server_012.phpt 2011-11-15 03:15:19 UTC (rev 319224) @@ -0,0 +1,55 @@ +--TEST-- +Bug #60159 (Router returns false, but POST is not passed to requested resource) +--SKIPIF-- +<?php +include "skipif.inc"; +?> +--FILE-- +<?php +include "php_cli_server.inc"; +php_cli_server_start('print_r($_REQUEST); $_REQUEST["foo"] = "bar"; return FALSE;'); +$doc_root = __DIR__; +file_put_contents($doc_root . '/request.php', '<?php print_r($_REQUEST); ?>'); + +list($host, $port) = explode(':', PHP_CLI_SERVER_ADDRESS); +$port = intval($port)?:80; + +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +if(fwrite($fp, <<<HEADER +POST /request.php HTTP/1.1 +Host: {$host} +Content-Type: application/x-www-form-urlencoded +Content-Length: 3 + +a=b +HEADER +)) { + while (!feof($fp)) { + echo fgets($fp); + } +} + +fclose($fp); +@unlink($doc_root . '/request.php'); + +?> +--EXPECTF-- +HTTP/1.1 200 OK +Host: %s +Connection: closed +X-Powered-By: PHP/%s +Content-type: text/html + +Array +( + [a] => b +) +Array +( + [a] => b + [foo] => bar +) Added: php/php-src/trunk/sapi/cli/tests/php_cli_server_013.phpt =================================================================== --- php/php-src/trunk/sapi/cli/tests/php_cli_server_013.phpt (rev 0) +++ php/php-src/trunk/sapi/cli/tests/php_cli_server_013.phpt 2011-11-15 03:15:19 UTC (rev 319224) @@ -0,0 +1,108 @@ +--TEST-- +No router, no script +--SKIPIF-- +<?php +include "skipif.inc"; +?> +--FILE-- +<?php +include "php_cli_server.inc"; +php_cli_server_start(NULL, TRUE); + +list($host, $port) = explode(':', PHP_CLI_SERVER_ADDRESS); +$port = intval($port)?:80; +$output = ''; + +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + + +if(fwrite($fp, <<<HEADER +POST / HTTP/1.1 +Host: {$host} +Content-Type: application/x-www-form-urlencoded +Content-Length: 3 + +a=b +HEADER +)) { + while (!feof($fp)) { + $output .= fgets($fp); + } +} + +echo preg_replace("/<style type=\"text\/css\">(.*?)<\/style>/s", "<style type=\"text/css\">AAA</style>", $output), "\n"; +fclose($fp); + + +$output = ''; +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +if(fwrite($fp, <<<HEADER +GET /main/style.css HTTP/1.1 +Host: {$host} + + +HEADER +)) { + while (!feof($fp)) { + $output .= fgets($fp); + } +} + +echo preg_replace("/<style type=\"text\/css\">(.*?)<\/style>/s", "<style type=\"text/css\">AAA</style>", $output), "\n"; +fclose($fp); + +$output = ''; +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +if(fwrite($fp, <<<HEADER +HEAD /main/foo/bar HTTP/1.1 +Host: {$host} + + +HEADER +)) { + while (!feof($fp)) { + $output .= fgets($fp); + } +} + +echo preg_replace("/<style type=\"text\/css\">(.*?)<\/style>/s", "<style type=\"text/css\">AAA</style>", $output), "\n"; +fclose($fp); +?> +--EXPECTF-- + +HTTP/1.1 404 Not Found +Host: %s +Connection: closed +Content-Type: text/html; charset=UTF-8 +Content-Length: %d + +<html><head><title>404 Not Found</title><style type="text/css">AAA</style> +</head><body><h1 class="h">Not Found</h1><p>The requested resource / was not found on this server.</p></body></html> +HTTP/1.1 404 Not Found +Host: %s +Connection: closed +Content-Type: text/html; charset=UTF-8 +Content-Length: %d + +<html><head><title>404 Not Found</title><style type="text/css">AAA</style> +</head><body><h1 class="h">Not Found</h1><p>The requested resource /main/style.css was not found on this server.</p></body></html> +HTTP/1.1 404 Not Found +Host: %s +Connection: closed +Content-Type: text/html; charset=UTF-8 +Content-Length: %d + +<html><head><title>404 Not Found</title><style type="text/css">AAA</style> +</head><body><h1 class="h">Not Found</h1><p>The requested resource /main/foo/bar was not found on this server.</p></body></html> +
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php