@@ -108,6 +108,8 @@ static pid_t *php_cli_server_workers;
108
108
static zend_long php_cli_server_workers_max ;
109
109
#endif
110
110
111
+ static zend_string * cli_concat_persistent_zstr_with_char (zend_string * old_str , const char * at , size_t length );
112
+
111
113
typedef struct php_cli_server_poller {
112
114
fd_set rfds , wfds ;
113
115
struct {
@@ -119,8 +121,7 @@ typedef struct php_cli_server_poller {
119
121
typedef struct php_cli_server_request {
120
122
enum php_http_method request_method ;
121
123
int protocol_version ;
122
- char * request_uri ;
123
- size_t request_uri_len ;
124
+ zend_string * request_uri ;
124
125
char * vpath ;
125
126
size_t vpath_len ;
126
127
char * path_translated ;
@@ -702,8 +703,8 @@ static void sapi_cli_server_register_variables(zval *track_vars_array) /* {{{ */
702
703
zend_string_release_ex (tmp , /* persistent */ false);
703
704
}
704
705
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 );
707
708
sapi_cli_server_register_known_var_char (track_vars_array ,
708
709
"REQUEST_METHOD" , strlen ("REQUEST_METHOD" ),
709
710
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
1191
1192
1192
1193
/* basic */
1193
1194
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 ) );
1195
1196
if (!basic_buf ) {
1196
1197
return ;
1197
1198
}
@@ -1369,7 +1370,6 @@ static void php_cli_server_request_ctor(php_cli_server_request *req) /* {{{ */
1369
1370
{
1370
1371
req -> protocol_version = 0 ;
1371
1372
req -> request_uri = NULL ;
1372
- req -> request_uri_len = 0 ;
1373
1373
req -> vpath = NULL ;
1374
1374
req -> vpath_len = 0 ;
1375
1375
req -> path_translated = NULL ;
@@ -1390,7 +1390,7 @@ static void php_cli_server_request_ctor(php_cli_server_request *req) /* {{{ */
1390
1390
static void php_cli_server_request_dtor (php_cli_server_request * req ) /* {{{ */
1391
1391
{
1392
1392
if (req -> request_uri ) {
1393
- pefree (req -> request_uri , 1 );
1393
+ zend_string_release_ex (req -> request_uri , /* persistent */ true );
1394
1394
}
1395
1395
if (req -> vpath ) {
1396
1396
pefree (req -> vpath , 1 );
@@ -1642,15 +1642,13 @@ static int php_cli_server_client_read_request_on_url(php_http_parser *parser, co
1642
1642
php_cli_server_client * client = parser -> data ;
1643
1643
if (EXPECTED (client -> request .request_uri == NULL )) {
1644
1644
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 ) ;
1647
1647
} else {
1648
1648
ZEND_ASSERT (client -> request .request_method == parser -> method );
1649
1649
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 );
1654
1652
}
1655
1653
return 0 ;
1656
1654
}
@@ -1901,7 +1899,7 @@ static void php_cli_server_client_populate_request_info(const php_cli_server_cli
1901
1899
1902
1900
request_info -> request_method = php_http_method_str (client -> request .request_method );
1903
1901
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 ) ;
1905
1903
request_info -> path_translated = client -> request .path_translated ;
1906
1904
request_info -> query_string = client -> request .query_string ;
1907
1905
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
1982
1980
php_cli_server_content_sender_ctor (& client -> content_sender );
1983
1981
client -> content_sender_initialized = true;
1984
1982
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 );
1986
1984
1987
1985
{
1988
1986
static const char prologue_template [] = "<!doctype html><html><head><title>%d %s</title>" ;
0 commit comments