Skip to content

Commit b37245b

Browse files
committed
Refactor registration of variables for the CLI SAPI
1 parent 55908db commit b37245b

File tree

1 file changed

+74
-31
lines changed

1 file changed

+74
-31
lines changed

sapi/cli/php_cli_server.c

+74-31
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,34 @@ static void sapi_cli_server_register_variable(zval *track_vars_array, const char
596596
}
597597
} /* }}} */
598598

599+
static void sapi_cli_server_register_known_var_char(zval *track_vars_array,
600+
const char *var_name, size_t var_name_len, const char *value, size_t value_len)
601+
{
602+
zval new_entry;
603+
604+
if (!value) {
605+
return;
606+
}
607+
608+
ZVAL_STRINGL_FAST(&new_entry, value, value_len);
609+
610+
php_register_known_variable(var_name, var_name_len, &new_entry, track_vars_array);
611+
}
612+
613+
static void sapi_cli_server_register_known_var_str(zval *track_vars_array,
614+
const char *var_name, size_t var_name_len, /* const */ zend_string *value)
615+
{
616+
zval new_entry;
617+
618+
if (!value) {
619+
return;
620+
}
621+
622+
ZVAL_STR_COPY(&new_entry, value);
623+
624+
php_register_known_variable(var_name, var_name_len, &new_entry, track_vars_array);
625+
}
626+
599627
/* The entry zval will always contain a zend_string* */
600628
static int sapi_cli_server_register_entry_cb(zval *entry, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */ {
601629
zval *track_vars_array = va_arg(args, zval *);
@@ -615,7 +643,7 @@ static int sapi_cli_server_register_entry_cb(zval *entry, int num_args, va_list
615643
}
616644
spprintf(&real_key, 0, "%s_%s", "HTTP", key);
617645
if (strcmp(key, "CONTENT_TYPE") == 0 || strcmp(key, "CONTENT_LENGTH") == 0) {
618-
// TODO make a version specialized for zend_string?
646+
/* Is it possible to use sapi_cli_server_register_known_var_char() and not go through the SAPI filter? */
619647
sapi_cli_server_register_variable(track_vars_array, key, Z_STRVAL_P(entry));
620648
}
621649
sapi_cli_server_register_variable(track_vars_array, real_key, Z_STRVAL_P(entry));
@@ -630,7 +658,9 @@ static int sapi_cli_server_register_entry_cb(zval *entry, int num_args, va_list
630658
static void sapi_cli_server_register_variables(zval *track_vars_array) /* {{{ */
631659
{
632660
php_cli_server_client *client = SG(server_context);
633-
sapi_cli_server_register_variable(track_vars_array, "DOCUMENT_ROOT", client->server->document_root);
661+
662+
sapi_cli_server_register_known_var_char(track_vars_array,
663+
"DOCUMENT_ROOT", strlen("DOCUMENT_ROOT"), client->server->document_root, client->server->document_root_len);
634664
{
635665
char *tmp;
636666
if ((tmp = strrchr(ZSTR_VAL(client->addr_str), ':'))) {
@@ -643,54 +673,67 @@ static void sapi_cli_server_register_variables(zval *track_vars_array) /* {{{ */
643673
port[7] = '\0';
644674
strncpy(addr, addr_start, addr_end - addr_start);
645675
addr[addr_end - addr_start] = '\0';
646-
sapi_cli_server_register_variable(track_vars_array, "REMOTE_ADDR", addr);
647-
sapi_cli_server_register_variable(track_vars_array, "REMOTE_PORT", port);
676+
sapi_cli_server_register_known_var_char(track_vars_array,
677+
"REMOTE_ADDR", strlen("REMOTE_ADDR"), addr, strlen(addr));
678+
sapi_cli_server_register_known_var_char(track_vars_array,
679+
"REMOTE_PORT", strlen("REMOTE_PORT"), port, strlen(port));
648680
} else {
649-
sapi_cli_server_register_variable(track_vars_array, "REMOTE_ADDR", ZSTR_VAL(client->addr_str));
681+
sapi_cli_server_register_known_var_str(track_vars_array,
682+
"REMOTE_ADDR", strlen("REMOTE_ADDR"), client->addr_str);
650683
}
651684
}
652685
{
653-
char *tmp;
654-
spprintf(&tmp, 0, "PHP %s Development Server", PHP_VERSION);
655-
sapi_cli_server_register_variable(track_vars_array, "SERVER_SOFTWARE", tmp);
656-
efree(tmp);
686+
zend_string *tmp = strpprintf(0, "PHP %s Development Server", PHP_VERSION);
687+
sapi_cli_server_register_known_var_str(track_vars_array, "SERVER_SOFTWARE", strlen("SERVER_SOFTWARE"), tmp);
688+
zend_string_release_ex(tmp, /* persistent */ false);
657689
}
658690
{
659-
char *tmp;
660-
spprintf(&tmp, 0, "HTTP/%d.%d", client->request.protocol_version / 100, client->request.protocol_version % 100);
661-
sapi_cli_server_register_variable(track_vars_array, "SERVER_PROTOCOL", tmp);
662-
efree(tmp);
691+
zend_string *tmp = strpprintf(0, "HTTP/%d.%d", client->request.protocol_version / 100, client->request.protocol_version % 100);
692+
sapi_cli_server_register_known_var_str(track_vars_array, "SERVER_PROTOCOL", strlen("SERVER_PROTOCOL"), tmp);
693+
zend_string_release_ex(tmp, /* persistent */ false);
663694
}
664-
sapi_cli_server_register_variable(track_vars_array, "SERVER_NAME", client->server->host);
695+
sapi_cli_server_register_known_var_char(track_vars_array,
696+
"SERVER_NAME", strlen("SERVER_NAME"), client->server->host, strlen(client->server->host));
665697
{
666-
char *tmp;
667-
spprintf(&tmp, 0, "%i", client->server->port);
668-
sapi_cli_server_register_variable(track_vars_array, "SERVER_PORT", tmp);
669-
efree(tmp);
670-
}
671-
672-
sapi_cli_server_register_variable(track_vars_array, "REQUEST_URI", client->request.request_uri);
673-
sapi_cli_server_register_variable(track_vars_array, "REQUEST_METHOD", SG(request_info).request_method);
674-
sapi_cli_server_register_variable(track_vars_array, "SCRIPT_NAME", client->request.vpath);
698+
zend_string *tmp = strpprintf(0, "%i", client->server->port);
699+
sapi_cli_server_register_known_var_str(track_vars_array, "SERVER_PORT", strlen("SERVER_PORT"), tmp);
700+
zend_string_release_ex(tmp, /* persistent */ false);
701+
}
702+
703+
sapi_cli_server_register_known_var_char(track_vars_array,
704+
"REQUEST_URI", strlen("REQUEST_URI"), client->request.request_uri, client->request.request_uri_len);
705+
sapi_cli_server_register_known_var_char(track_vars_array,
706+
"REQUEST_METHOD", strlen("REQUEST_METHOD"),
707+
SG(request_info).request_method, strlen(SG(request_info).request_method));
708+
sapi_cli_server_register_known_var_char(track_vars_array,
709+
"SCRIPT_NAME", strlen("SCRIPT_NAME"), client->request.vpath, client->request.vpath_len);
675710
if (SG(request_info).path_translated) {
676-
sapi_cli_server_register_variable(track_vars_array, "SCRIPT_FILENAME", SG(request_info).path_translated);
711+
sapi_cli_server_register_known_var_char(track_vars_array,
712+
"SCRIPT_FILENAME", strlen("SCRIPT_FILENAME"),
713+
SG(request_info).path_translated, strlen(SG(request_info).path_translated));
677714
} else if (client->server->router) {
678-
sapi_cli_server_register_variable(track_vars_array, "SCRIPT_FILENAME", client->server->router);
715+
sapi_cli_server_register_known_var_char(track_vars_array,
716+
"SCRIPT_FILENAME", strlen("SCRIPT_FILENAME"), client->server->router, client->server->router_len);
679717
}
680718
if (client->request.path_info) {
681-
sapi_cli_server_register_variable(track_vars_array, "PATH_INFO", client->request.path_info);
719+
sapi_cli_server_register_known_var_char(track_vars_array,
720+
"PATH_INFO", strlen("PATH_INFO"), client->request.path_info, client->request.path_info_len);
682721
}
683722
if (client->request.path_info_len) {
684-
char *tmp;
685-
spprintf(&tmp, 0, "%s%s", client->request.vpath, client->request.path_info);
686-
sapi_cli_server_register_variable(track_vars_array, "PHP_SELF", tmp);
687-
efree(tmp);
723+
zend_string *tmp = strpprintf(0, "%s%s", client->request.vpath, client->request.path_info);
724+
sapi_cli_server_register_known_var_str(track_vars_array, "PHP_SELF", strlen("PHP_SELF"), tmp);
725+
zend_string_release_ex(tmp, /* persistent */ false);
688726
} else {
689-
sapi_cli_server_register_variable(track_vars_array, "PHP_SELF", client->request.vpath);
727+
sapi_cli_server_register_known_var_char(track_vars_array,
728+
"PHP_SELF", strlen("PHP_SELF"), client->request.vpath, client->request.vpath_len);
690729
}
691730
if (client->request.query_string) {
731+
/* Use sapi_cli_server_register_variable() to pass query string through SAPI input filter,
732+
* and check keys are proper PHP var names */
692733
sapi_cli_server_register_variable(track_vars_array, "QUERY_STRING", client->request.query_string);
693734
}
735+
/* Use sapi_cli_server_register_variable() to pass header values through SAPI input filter,
736+
* and check keys are proper PHP var names */
694737
zend_hash_apply_with_arguments(&client->request.headers, (apply_func_args_t)sapi_cli_server_register_entry_cb, 1, track_vars_array);
695738
} /* }}} */
696739

0 commit comments

Comments
 (0)