Skip to content

Commit c8f4801

Browse files
authored
Convert client->request.request_uri to zend_string (#9086)
1 parent dd00296 commit c8f4801

File tree

1 file changed

+13
-15
lines changed

1 file changed

+13
-15
lines changed

sapi/cli/php_cli_server.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ static pid_t *php_cli_server_workers;
108108
static zend_long php_cli_server_workers_max;
109109
#endif
110110

111+
static zend_string* cli_concat_persistent_zstr_with_char(zend_string *old_str, const char *at, size_t length);
112+
111113
typedef struct php_cli_server_poller {
112114
fd_set rfds, wfds;
113115
struct {
@@ -119,8 +121,7 @@ typedef struct php_cli_server_poller {
119121
typedef struct php_cli_server_request {
120122
enum php_http_method request_method;
121123
int protocol_version;
122-
char *request_uri;
123-
size_t request_uri_len;
124+
zend_string *request_uri;
124125
char *vpath;
125126
size_t vpath_len;
126127
char *path_translated;
@@ -702,8 +703,8 @@ static void sapi_cli_server_register_variables(zval *track_vars_array) /* {{{ */
702703
zend_string_release_ex(tmp, /* persistent */ false);
703704
}
704705

705-
sapi_cli_server_register_known_var_char(track_vars_array,
706-
"REQUEST_URI", strlen("REQUEST_URI"), client->request.request_uri, client->request.request_uri_len);
706+
sapi_cli_server_register_known_var_str(track_vars_array,
707+
"REQUEST_URI", strlen("REQUEST_URI"), client->request.request_uri);
707708
sapi_cli_server_register_known_var_char(track_vars_array,
708709
"REQUEST_METHOD", strlen("REQUEST_METHOD"),
709710
SG(request_info).request_method, strlen(SG(request_info).request_method));
@@ -1191,7 +1192,7 @@ static void php_cli_server_log_response(php_cli_server_client *client, int statu
11911192

11921193
/* basic */
11931194
spprintf(&basic_buf, 0, "%s [%d]: %s %s", ZSTR_VAL(client->addr_str), status,
1194-
php_http_method_str(client->request.request_method), client->request.request_uri);
1195+
php_http_method_str(client->request.request_method), ZSTR_VAL(client->request.request_uri));
11951196
if (!basic_buf) {
11961197
return;
11971198
}
@@ -1369,7 +1370,6 @@ static void php_cli_server_request_ctor(php_cli_server_request *req) /* {{{ */
13691370
{
13701371
req->protocol_version = 0;
13711372
req->request_uri = NULL;
1372-
req->request_uri_len = 0;
13731373
req->vpath = NULL;
13741374
req->vpath_len = 0;
13751375
req->path_translated = NULL;
@@ -1390,7 +1390,7 @@ static void php_cli_server_request_ctor(php_cli_server_request *req) /* {{{ */
13901390
static void php_cli_server_request_dtor(php_cli_server_request *req) /* {{{ */
13911391
{
13921392
if (req->request_uri) {
1393-
pefree(req->request_uri, 1);
1393+
zend_string_release_ex(req->request_uri, /* persistent */ true);
13941394
}
13951395
if (req->vpath) {
13961396
pefree(req->vpath, 1);
@@ -1642,15 +1642,13 @@ static int php_cli_server_client_read_request_on_url(php_http_parser *parser, co
16421642
php_cli_server_client *client = parser->data;
16431643
if (EXPECTED(client->request.request_uri == NULL)) {
16441644
client->request.request_method = parser->method;
1645-
client->request.request_uri = pestrndup(at, length, 1);
1646-
client->request.request_uri_len = length;
1645+
client->request.request_uri = zend_string_init(at, length, /* persistent */ true);
1646+
GC_MAKE_PERSISTENT_LOCAL(client->request.request_uri);
16471647
} else {
16481648
ZEND_ASSERT(client->request.request_method == parser->method);
16491649
ZEND_ASSERT(length <= PHP_HTTP_MAX_HEADER_SIZE && PHP_HTTP_MAX_HEADER_SIZE - length >= client->request.query_string_len);
1650-
client->request.request_uri = perealloc(client->request.request_uri, client->request.request_uri_len + length + 1, 1);
1651-
memcpy(client->request.request_uri + client->request.request_uri_len, at, length);
1652-
client->request.request_uri_len += length;
1653-
client->request.request_uri[client->request.request_uri_len] = '\0';
1650+
/* Extend URI, append content to it */
1651+
client->request.request_uri = cli_concat_persistent_zstr_with_char(client->request.request_uri, at, length);
16541652
}
16551653
return 0;
16561654
}
@@ -1901,7 +1899,7 @@ static void php_cli_server_client_populate_request_info(const php_cli_server_cli
19011899

19021900
request_info->request_method = php_http_method_str(client->request.request_method);
19031901
request_info->proto_num = client->request.protocol_version;
1904-
request_info->request_uri = client->request.request_uri;
1902+
request_info->request_uri = ZSTR_VAL(client->request.request_uri);
19051903
request_info->path_translated = client->request.path_translated;
19061904
request_info->query_string = client->request.query_string;
19071905
request_info->content_length = client->request.content_len;
@@ -1982,7 +1980,7 @@ static zend_result php_cli_server_send_error_page(php_cli_server *server, php_cl
19821980
php_cli_server_content_sender_ctor(&client->content_sender);
19831981
client->content_sender_initialized = true;
19841982

1985-
escaped_request_uri = php_escape_html_entities_ex((const unsigned char *) client->request.request_uri, client->request.request_uri_len, 0, ENT_QUOTES, NULL, /* double_encode */ 0, /* quiet */ 0);
1983+
escaped_request_uri = php_escape_html_entities_ex((const unsigned char *) ZSTR_VAL(client->request.request_uri), ZSTR_LEN(client->request.request_uri), 0, ENT_QUOTES, NULL, /* double_encode */ 0, /* quiet */ 0);
19861984

19871985
{
19881986
static const char prologue_template[] = "<!doctype html><html><head><title>%d %s</title>";

0 commit comments

Comments
 (0)