summaryrefslogtreecommitdiff
path: root/sapi/cli/php_cli_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'sapi/cli/php_cli_server.c')
-rw-r--r--sapi/cli/php_cli_server.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c
index 198afc8a6b..b324958052 100644
--- a/sapi/cli/php_cli_server.c
+++ b/sapi/cli/php_cli_server.c
@@ -17,8 +17,6 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_cli.c 306938 2011-01-01 02:17:06Z felipe $ */
-
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
@@ -360,7 +358,7 @@ static void append_essential_headers(smart_str* buffer, php_cli_server_client *c
smart_str_appendl_ex(buffer, "Date: ", 6, persistent);
smart_str_appends_ex(buffer, dt->val, persistent);
smart_str_appendl_ex(buffer, "\r\n", 2, persistent);
- zend_string_release(dt);
+ zend_string_release_ex(dt, 0);
}
smart_str_appendl_ex(buffer, "Connection: close\r\n", sizeof("Connection: close\r\n") - 1, persistent);
@@ -639,10 +637,14 @@ static void sapi_cli_server_register_variables(zval *track_vars_array) /* {{{ */
char *tmp;
if ((tmp = strrchr(client->addr_str, ':'))) {
char addr[64], port[8];
+ const char *addr_start = client->addr_str, *addr_end = tmp;
+ if (addr_start[0] == '[') addr_start++;
+ if (addr_end[-1] == ']') addr_end--;
+
strncpy(port, tmp + 1, 8);
port[7] = '\0';
- strncpy(addr, client->addr_str, tmp - client->addr_str);
- addr[tmp - client->addr_str] = '\0';
+ strncpy(addr, addr_start, addr_end - addr_start);
+ addr[addr_end - addr_start] = '\0';
sapi_cli_server_register_variable(track_vars_array, "REMOTE_ADDR", addr);
sapi_cli_server_register_variable(track_vars_array, "REMOTE_PORT", port);
} else {
@@ -1574,11 +1576,14 @@ static void php_cli_server_client_save_header(php_cli_server_client *client)
{
/* strip off the colon */
zend_string *orig_header_name = zend_string_init(client->current_header_name, client->current_header_name_len, 1);
- char *lc_header_name = zend_str_tolower_dup(client->current_header_name, client->current_header_name_len);
- zend_hash_str_add_ptr(&client->request.headers, lc_header_name, client->current_header_name_len, client->current_header_value);
+ zend_string *lc_header_name = zend_string_alloc(client->current_header_name_len, 1);
+ zend_str_tolower_copy(ZSTR_VAL(lc_header_name), client->current_header_name, client->current_header_name_len);
+ GC_MAKE_PERSISTENT_LOCAL(orig_header_name);
+ GC_MAKE_PERSISTENT_LOCAL(lc_header_name);
+ zend_hash_add_ptr(&client->request.headers, lc_header_name, client->current_header_value);
zend_hash_add_ptr(&client->request.headers_original_case, orig_header_name, client->current_header_value);
- efree(lc_header_name);
- zend_string_release(orig_header_name);
+ zend_string_release_ex(lc_header_name, 1);
+ zend_string_release_ex(orig_header_name, 1);
if (client->current_header_name_allocated) {
pefree(client->current_header_name, 1);
@@ -1832,7 +1837,7 @@ static int php_cli_server_client_ctor(php_cli_server_client *client, php_cli_ser
php_network_populate_name_from_sockaddr(addr, addr_len, &addr_str, NULL, 0);
client->addr_str = pestrndup(ZSTR_VAL(addr_str), ZSTR_LEN(addr_str), 1);
client->addr_str_len = ZSTR_LEN(addr_str);
- zend_string_release(addr_str);
+ zend_string_release_ex(addr_str, 0);
}
php_http_parser_init(&client->parser, PHP_HTTP_REQUEST);
client->request_read = 0;
@@ -1948,7 +1953,7 @@ static int php_cli_server_send_error_page(php_cli_server *server, php_cli_server
chunk = php_cli_server_chunk_heap_new(buffer.s, ZSTR_VAL(buffer.s), ZSTR_LEN(buffer.s));
if (!chunk) {
- smart_str_free(&buffer);
+ smart_str_free_ex(&buffer, 1);
goto fail;
}
php_cli_server_buffer_prepend(&client->content_sender.buffer, chunk);
@@ -2030,9 +2035,6 @@ static int php_cli_server_begin_send_static(php_cli_server *server, php_cli_serv
php_cli_server_chunk *chunk;
smart_str buffer = { 0 };
const char *mime_type = get_mime_type(server, client->request.ext, client->request.ext_len);
- if (!mime_type) {
- mime_type = "application/octet-stream";
- }
append_http_status_line(&buffer, client->request.protocol_version, status, 1);
if (!buffer.s) {
@@ -2041,19 +2043,21 @@ static int php_cli_server_begin_send_static(php_cli_server *server, php_cli_serv
return FAILURE;
}
append_essential_headers(&buffer, client, 1);
- smart_str_appendl_ex(&buffer, "Content-Type: ", sizeof("Content-Type: ") - 1, 1);
- smart_str_appends_ex(&buffer, mime_type, 1);
- if (strncmp(mime_type, "text/", 5) == 0) {
- smart_str_appends_ex(&buffer, "; charset=UTF-8", 1);
+ if (mime_type) {
+ smart_str_appendl_ex(&buffer, "Content-Type: ", sizeof("Content-Type: ") - 1, 1);
+ smart_str_appends_ex(&buffer, mime_type, 1);
+ if (strncmp(mime_type, "text/", 5) == 0) {
+ smart_str_appends_ex(&buffer, "; charset=UTF-8", 1);
+ }
+ smart_str_appendl_ex(&buffer, "\r\n", 2, 1);
}
- smart_str_appendl_ex(&buffer, "\r\n", 2, 1);
smart_str_appends_ex(&buffer, "Content-Length: ", 1);
smart_str_append_unsigned_ex(&buffer, client->request.sb.st_size, 1);
smart_str_appendl_ex(&buffer, "\r\n", 2, 1);
smart_str_appendl_ex(&buffer, "\r\n", 2, 1);
chunk = php_cli_server_chunk_heap_new(buffer.s, ZSTR_VAL(buffer.s), ZSTR_LEN(buffer.s));
if (!chunk) {
- smart_str_free(&buffer);
+ smart_str_free_ex(&buffer, 1);
php_cli_server_log_response(client, 500, NULL);
return FAILURE;
}
@@ -2289,7 +2293,7 @@ static int php_cli_server_ctor(php_cli_server *server, const char *addr, const c
if (server_sock == SOCK_ERR) {
php_cli_server_logf("Failed to listen on %s:%d (reason: %s)", host, port, errstr ? ZSTR_VAL(errstr) : "?");
if (errstr) {
- zend_string_release(errstr);
+ zend_string_release_ex(errstr, 0);
}
retval = FAILURE;
goto out;