@@ -108,6 +108,8 @@ static pid_t *php_cli_server_workers;
108108static 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+
111113typedef struct php_cli_server_poller {
112114 fd_set rfds , wfds ;
113115 struct {
@@ -119,8 +121,7 @@ typedef struct php_cli_server_poller {
119121typedef 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) /* {{{ */
13901390static 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