diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 19ece98e05216..be95be579fedf 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -3715,7 +3715,7 @@ function parse_url(string $url, int $component = -1): int|string|array|null|fals * @compile-time-eval * @refcount 1 */ -function urlencode(string $string): string {} +function urlencode(string|int $string): string {} /** * @compile-time-eval @@ -3727,7 +3727,7 @@ function urldecode(string $string): string {} * @compile-time-eval * @refcount 1 */ -function rawurlencode(string $string): string {} +function rawurlencode(string|int $string): string {} /** * @compile-time-eval diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index b84e9f8dd7087..3fac7a0b29c95 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: e277d3a5699db6aeedb08642720be841dc37d683 */ + * Stub hash: f7c38f9d4e4ac96c42e7b1ec2046d79c565c64b4 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -2077,11 +2077,13 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_parse_url, 0, 1, MAY_BE_LONG|MAY ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, component, IS_LONG, 0, "-1") ZEND_END_ARG_INFO() -#define arginfo_urlencode arginfo_base64_encode +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_urlencode, 0, 1, IS_STRING, 0) + ZEND_ARG_TYPE_MASK(0, string, MAY_BE_STRING|MAY_BE_LONG, NULL) +ZEND_END_ARG_INFO() #define arginfo_urldecode arginfo_base64_encode -#define arginfo_rawurlencode arginfo_base64_encode +#define arginfo_rawurlencode arginfo_urlencode #define arginfo_rawurldecode arginfo_base64_encode diff --git a/ext/standard/url.c b/ext/standard/url.c index 7d564b510bc9f..16f8fcaa89721 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -552,13 +552,28 @@ PHPAPI zend_string *php_url_encode(char const *s, size_t len) /* {{{ URL-encodes string */ PHP_FUNCTION(urlencode) { - zend_string *in_str; + zend_string *in_str = NULL; + zend_long in_long; + zend_string *tmpstr = NULL; + zend_string *encoded_str; - ZEND_PARSE_PARAMETERS_START(1, 1) - Z_PARAM_STR(in_str) - ZEND_PARSE_PARAMETERS_END(); + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_STR_OR_LONG(in_str, in_long) + ZEND_PARSE_PARAMETERS_END(); + + if (in_str == NULL) { + /* Input is an integer */ + in_str = tmpstr = zend_long_to_str(in_long); + } - RETURN_STR(php_url_encode(ZSTR_VAL(in_str), ZSTR_LEN(in_str))); + encoded_str = php_url_encode(ZSTR_VAL(in_str), ZSTR_LEN(in_str)); + + /* Release the temporary string if we allocated one */ + if (tmpstr != NULL) { + zend_string_release(tmpstr); + } + + RETURN_STR(encoded_str); } /* }}} */ @@ -614,13 +629,29 @@ PHPAPI zend_string *php_raw_url_encode(char const *s, size_t len) /* {{{ URL-encodes string */ PHP_FUNCTION(rawurlencode) { - zend_string *in_str; + zend_string *in_str = NULL; + zend_long in_long; + zend_string *tmpstr = NULL; + zend_string *encoded_str; - ZEND_PARSE_PARAMETERS_START(1, 1) - Z_PARAM_STR(in_str) - ZEND_PARSE_PARAMETERS_END(); + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_STR_OR_LONG(in_str, in_long) + ZEND_PARSE_PARAMETERS_END(); + + if (in_str == NULL) { + /* Input is an integer */ + in_str = tmpstr = zend_long_to_str(in_long); + } + + encoded_str = php_raw_url_encode(ZSTR_VAL(in_str), ZSTR_LEN(in_str)); + + + /* Release the temporary string if we allocated one */ + if (tmpstr != NULL) { + zend_string_release(tmpstr); + } - RETURN_STR(php_raw_url_encode(ZSTR_VAL(in_str), ZSTR_LEN(in_str))); + RETURN_STR(encoded_str); } /* }}} */ diff --git a/tests/strings/001.phpt b/tests/strings/001.phpt index 0f1f749459fba..49380999350e4 100644 --- a/tests/strings/001.phpt +++ b/tests/strings/001.phpt @@ -2,7 +2,7 @@ String functions --FILE-- --EXPECT-- Testing strtok: passed @@ -221,3 +226,6 @@ Testing addslashes: passed Testing stripslashes: passed Testing uniqid(true): passed Testing uniqid(false): passed +testing (raw)urlencode(int) +string(1) "1" +string(1) "1"