mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fixed bug #60159 (Router returns false, but POST is not passed to requested
resource) and bug #55759 (mem leak when use built-in server)
This commit is contained in:
parent
0f4ebd949e
commit
f8386e349f
4 changed files with 225 additions and 59 deletions
5
NEWS
5
NEWS
|
@ -19,6 +19,11 @@ PHP NEWS
|
||||||
. Fixed bug #60282 (Segfault when using ob_gzhandler() with open buffers).
|
. Fixed bug #60282 (Segfault when using ob_gzhandler() with open buffers).
|
||||||
(Laruence)
|
(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
|
11 Nov 2011, PHP 5.4.0 RC1
|
||||||
- General improvements:
|
- General improvements:
|
||||||
. Changed silent conversion of array to string to produce a notice. (Patrick)
|
. Changed silent conversion of array to string to produce a notice. (Patrick)
|
||||||
|
|
|
@ -1815,22 +1815,8 @@ fail:
|
||||||
|
|
||||||
static int php_cli_server_dispatch_script(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */
|
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) {
|
if (strlen(client->request.path_translated) != client->request.path_translated_len) {
|
||||||
/* can't handle paths that contain nul bytes */
|
/* 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);
|
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_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;
|
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) /* {{{ */
|
static int php_cli_server_request_startup(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) { /* {{{ */
|
||||||
{
|
char **auth;
|
||||||
int decline = 0;
|
|
||||||
|
|
||||||
if (!server->router) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
php_cli_server_client_populate_request_info(client, &SG(request_info));
|
php_cli_server_client_populate_request_info(client, &SG(request_info));
|
||||||
{
|
if (SUCCESS == zend_hash_find(&client->request.headers, "Authorization", sizeof("Authorization"), (void**)&auth)) {
|
||||||
char **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;
|
SG(sapi_headers).http_response_code = 200;
|
||||||
if (FAILURE == php_request_startup(TSRMLS_C)) {
|
if (FAILURE == php_request_startup(TSRMLS_C)) {
|
||||||
/* should never be happen */
|
/* should never be happen */
|
||||||
destroy_request_info(&SG(request_info));
|
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)) {
|
if (!php_handle_special_queries(TSRMLS_C)) {
|
||||||
zend_file_handle zfd;
|
zend_file_handle zfd;
|
||||||
char *old_cwd;
|
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);
|
free_alloca(old_cwd, use_heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (decline) {
|
return 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;
|
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
static int php_cli_server_dispatch(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) /* {{{ */
|
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;
|
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) {
|
if (server->router || !is_static_file) {
|
||||||
goto fail;
|
if (FAILURE == php_cli_server_request_startup(server, client TSRMLS_CC)) {
|
||||||
} else if (status > 0) {
|
SG(server_context) = NULL;
|
||||||
if (client->request.ext_len == 3 && memcmp(client->request.ext, "php", 3) == 0 && client->request.path_translated) {
|
php_cli_server_close_connection(server, client TSRMLS_CC);
|
||||||
if (SUCCESS != php_cli_server_dispatch_script(server, client TSRMLS_CC) &&
|
destroy_request_info(&SG(request_info));
|
||||||
SUCCESS != php_cli_server_send_error_page(server, client, 500 TSRMLS_CC)) {
|
return SUCCESS;
|
||||||
goto fail;
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (SUCCESS != php_cli_server_begin_send_static(server, client TSRMLS_CC)) {
|
if (server->router) {
|
||||||
goto fail;
|
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;
|
if (!is_static_file) {
|
||||||
fail:
|
if (SUCCESS == php_cli_server_dispatch_script(server, client TSRMLS_CC)
|
||||||
SG(server_context) = 0;
|
|| SUCCESS != php_cli_server_send_error_page(server, client, 500 TSRMLS_CC)) {
|
||||||
php_cli_server_close_connection(server, client 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;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
55
sapi/cli/tests/php_cli_server_012.phpt
Normal file
55
sapi/cli/tests/php_cli_server_012.phpt
Normal file
|
@ -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
|
||||||
|
)
|
108
sapi/cli/tests/php_cli_server_013.phpt
Normal file
108
sapi/cli/tests/php_cli_server_013.phpt
Normal file
|
@ -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>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue