From: Xinchen Hui Date: Tue, 15 Nov 2011 03:15:19 +0000 (+0000) Subject: Fixed bug #60159 (Router returns false, but POST is not passed to requested X-Git-Tag: php-5.5.0alpha1~893 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f8503b4332dd27d2e60147e318212f9f6c39c3ce;p=php Fixed bug #60159 (Router returns false, but POST is not passed to requested resource) and bug #55759 (mem leak when use built-in server) --- diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 597efc8e63..9d3c8191ae 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -1815,22 +1815,8 @@ fail: 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 @@ static int php_cli_server_dispatch_script(php_cli_server *server, php_cli_server } 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_begin_send_static(php_cli_server *server, php_cli_serv } /* }}} */ -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,44 +1956,51 @@ static int php_cli_server_dispatch_router(php_cli_server *server, php_cli_server 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; - return SUCCESS; -fail: - SG(server_context) = 0; - php_cli_server_close_connection(server, client TSRMLS_CC); + + 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; } /* }}} */ diff --git a/sapi/cli/tests/php_cli_server.inc b/sapi/cli/tests/php_cli_server.inc index 26abe5492a..ab754eb408 100644 --- a/sapi/cli/tests/php_cli_server.inc +++ b/sapi/cli/tests/php_cli_server.inc @@ -5,7 +5,9 @@ function php_cli_server_start($code = 'echo "Hello world";', $no_router = FALSE) $php_executable = getenv('TEST_PHP_EXECUTABLE'); $doc_root = __DIR__; $router = "index.php"; - file_put_contents($doc_root . '/' . $router, ''); + if ($code) { + file_put_contents($doc_root . '/' . $router, ''); + } $descriptorspec = array( 0 => STDIN, diff --git a/sapi/cli/tests/php_cli_server_012.phpt b/sapi/cli/tests/php_cli_server_012.phpt new file mode 100644 index 0000000000..8d0f22ec7a --- /dev/null +++ b/sapi/cli/tests/php_cli_server_012.phpt @@ -0,0 +1,55 @@ +--TEST-- +Bug #60159 (Router returns false, but POST is not passed to requested resource) +--SKIPIF-- + +--FILE-- +'); + +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, <<
+--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 +) diff --git a/sapi/cli/tests/php_cli_server_013.phpt b/sapi/cli/tests/php_cli_server_013.phpt new file mode 100644 index 0000000000..caefdd48fa --- /dev/null +++ b/sapi/cli/tests/php_cli_server_013.phpt @@ -0,0 +1,108 @@ +--TEST-- +No router, no script +--SKIPIF-- + +--FILE-- +(.*?)<\/style>/s", "", $output), "\n"; +fclose($fp); + + +$output = ''; +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +if(fwrite($fp, <<
(.*?)<\/style>/s", "", $output), "\n"; +fclose($fp); + +$output = ''; +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +if(fwrite($fp, <<
(.*?)<\/style>/s", "", $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 + +404 Not Found +

Not Found

The requested resource / was not found on this server.

+HTTP/1.1 404 Not Found +Host: %s +Connection: closed +Content-Type: text/html; charset=UTF-8 +Content-Length: %d + +404 Not Found +

Not Found

The requested resource /main/style.css was not found on this server.

+HTTP/1.1 404 Not Found +Host: %s +Connection: closed +Content-Type: text/html; charset=UTF-8 +Content-Length: %d + +404 Not Found +

Not Found

The requested resource /main/foo/bar was not found on this server.

+