mirror of
https://github.com/php/php-src.git
synced 2026-04-29 19:23:22 +02:00
Refactor php_url_(en|de)code to return zend_string
This commit is contained in:
+10
-11
@@ -75,11 +75,12 @@ PHPAPI int php_header(TSRMLS_D)
|
||||
|
||||
PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, time_t expires, char *path, int path_len, char *domain, int domain_len, int secure, int url_encode, int httponly TSRMLS_DC)
|
||||
{
|
||||
char *cookie, *encoded_value = NULL;
|
||||
char *cookie;
|
||||
int len=sizeof("Set-Cookie: ");
|
||||
char *dt;
|
||||
sapi_header_line ctr = {0};
|
||||
int result;
|
||||
zend_string *encoded_value = NULL;
|
||||
|
||||
if (name && strpbrk(name, "=,; \t\r\n\013\014") != NULL) { /* man isspace for \013 and \014 */
|
||||
zend_error( E_WARNING, "Cookie names cannot contain any of the following '=,; \\t\\r\\n\\013\\014'" );
|
||||
@@ -93,14 +94,12 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t
|
||||
|
||||
len += name_len;
|
||||
if (value && url_encode) {
|
||||
int encoded_value_len;
|
||||
|
||||
encoded_value = php_url_encode(value, value_len, &encoded_value_len);
|
||||
len += encoded_value_len;
|
||||
} else if ( value ) {
|
||||
encoded_value = estrdup(value);
|
||||
len += value_len;
|
||||
encoded_value = php_url_encode(value, value_len);
|
||||
} else if (value) {
|
||||
encoded_value = STR_INIT(value, value_len, 0);
|
||||
}
|
||||
|
||||
len += encoded_value->len;
|
||||
if (path) {
|
||||
len += path_len;
|
||||
}
|
||||
@@ -120,7 +119,7 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t
|
||||
snprintf(cookie, len + 100, "Set-Cookie: %s=deleted; expires=%s; Max-Age=0", name, dt);
|
||||
efree(dt);
|
||||
} else {
|
||||
snprintf(cookie, len + 100, "Set-Cookie: %s=%s", name, value ? encoded_value : "");
|
||||
snprintf(cookie, len + 100, "Set-Cookie: %s=%s", name, value ? encoded_value->val : "");
|
||||
if (expires > 0) {
|
||||
const char *p;
|
||||
char tsdelta[13];
|
||||
@@ -131,7 +130,7 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t
|
||||
if (!p || *(p + 5) != ' ') {
|
||||
efree(dt);
|
||||
efree(cookie);
|
||||
efree(encoded_value);
|
||||
STR_FREE(encoded_value);
|
||||
zend_error(E_WARNING, "Expiry date cannot have a year greater than 9999");
|
||||
return FAILURE;
|
||||
}
|
||||
@@ -145,7 +144,7 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t
|
||||
}
|
||||
|
||||
if (encoded_value) {
|
||||
efree(encoded_value);
|
||||
STR_FREE(encoded_value);
|
||||
}
|
||||
|
||||
if (path && path_len > 0) {
|
||||
|
||||
+54
-29
@@ -32,8 +32,8 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
|
||||
zval *type, char *arg_sep, int enc_type TSRMLS_DC)
|
||||
{
|
||||
zend_string *key = NULL;
|
||||
char *ekey, *newprefix, *p, *prop_name;
|
||||
int arg_sep_len, ekey_len, key_type, newprefix_len, prop_len;
|
||||
char *newprefix, *p, *prop_name;
|
||||
int arg_sep_len, key_type, newprefix_len, prop_len;
|
||||
ulong idx;
|
||||
zval *zdata = NULL, copyzval;
|
||||
|
||||
@@ -84,12 +84,13 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
|
||||
}
|
||||
if (Z_TYPE_P(zdata) == IS_ARRAY || Z_TYPE_P(zdata) == IS_OBJECT) {
|
||||
if (key_type == HASH_KEY_IS_STRING) {
|
||||
zend_string *ekey;
|
||||
if (enc_type == PHP_QUERY_RFC3986) {
|
||||
ekey = php_raw_url_encode(prop_name, prop_len, &ekey_len);
|
||||
ekey = php_raw_url_encode(prop_name, prop_len);
|
||||
} else {
|
||||
ekey = php_url_encode(prop_name, prop_len, &ekey_len);
|
||||
ekey = php_url_encode(prop_name, prop_len);
|
||||
}
|
||||
newprefix_len = key_suffix_len + ekey_len + key_prefix_len + 3 /* %5B */;
|
||||
newprefix_len = key_suffix_len + ekey->len + key_prefix_len + 3 /* %5B */;
|
||||
newprefix = emalloc(newprefix_len + 1);
|
||||
p = newprefix;
|
||||
|
||||
@@ -98,9 +99,9 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
|
||||
p += key_prefix_len;
|
||||
}
|
||||
|
||||
memcpy(p, ekey, ekey_len);
|
||||
p += ekey_len;
|
||||
efree(ekey);
|
||||
memcpy(p, ekey->val, ekey->len);
|
||||
p += ekey->len;
|
||||
STR_FREE(ekey);
|
||||
|
||||
if (key_suffix) {
|
||||
memcpy(p, key_suffix, key_suffix_len);
|
||||
@@ -111,6 +112,8 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
|
||||
*(p++) = 'B';
|
||||
*p = '\0';
|
||||
} else {
|
||||
char *ekey;
|
||||
int ekey_len;
|
||||
/* Is an integer key */
|
||||
ekey_len = spprintf(&ekey, 0, "%ld", idx);
|
||||
newprefix_len = key_prefix_len + num_prefix_len + ekey_len + key_suffix_len + 3 /* %5B */;
|
||||
@@ -152,14 +155,17 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
|
||||
/* Simple key=value */
|
||||
smart_str_appendl(formstr, key_prefix, key_prefix_len);
|
||||
if (key_type == HASH_KEY_IS_STRING) {
|
||||
zend_string *ekey;
|
||||
if (enc_type == PHP_QUERY_RFC3986) {
|
||||
ekey = php_raw_url_encode(prop_name, prop_len, &ekey_len);
|
||||
ekey = php_raw_url_encode(prop_name, prop_len);
|
||||
} else {
|
||||
ekey = php_url_encode(prop_name, prop_len, &ekey_len);
|
||||
ekey = php_url_encode(prop_name, prop_len);
|
||||
}
|
||||
smart_str_appendl(formstr, ekey, ekey_len);
|
||||
efree(ekey);
|
||||
smart_str_appendl(formstr, ekey->val, ekey->len);
|
||||
STR_FREE(ekey);
|
||||
} else {
|
||||
char *ekey;
|
||||
int ekey_len;
|
||||
/* Numeric key */
|
||||
if (num_prefix) {
|
||||
smart_str_appendl(formstr, num_prefix, num_prefix_len);
|
||||
@@ -171,33 +177,52 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
|
||||
smart_str_appendl(formstr, key_suffix, key_suffix_len);
|
||||
smart_str_appendl(formstr, "=", 1);
|
||||
switch (Z_TYPE_P(zdata)) {
|
||||
case IS_STRING:
|
||||
if (enc_type == PHP_QUERY_RFC3986) {
|
||||
ekey = php_raw_url_encode(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata), &ekey_len);
|
||||
} else {
|
||||
ekey = php_url_encode(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata), &ekey_len);
|
||||
case IS_STRING: {
|
||||
zend_string *ekey;
|
||||
if (enc_type == PHP_QUERY_RFC3986) {
|
||||
ekey = php_raw_url_encode(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata));
|
||||
} else {
|
||||
ekey = php_url_encode(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata));
|
||||
}
|
||||
smart_str_appendl(formstr, ekey->val, ekey->len);
|
||||
STR_FREE(ekey);
|
||||
}
|
||||
break;
|
||||
case IS_LONG:
|
||||
case IS_BOOL:
|
||||
ekey_len = spprintf(&ekey, 0, "%ld", Z_LVAL_P(zdata));
|
||||
{
|
||||
char *ekey;
|
||||
int ekey_len;
|
||||
ekey_len = spprintf(&ekey, 0, "%ld", Z_LVAL_P(zdata));
|
||||
smart_str_appendl(formstr, ekey, ekey_len);
|
||||
efree(ekey);
|
||||
}
|
||||
break;
|
||||
case IS_DOUBLE:
|
||||
ekey_len = spprintf(&ekey, 0, "%.*G", (int) EG(precision), Z_DVAL_P(zdata));
|
||||
{
|
||||
char *ekey;
|
||||
int ekey_len;
|
||||
ekey_len = spprintf(&ekey, 0, "%.*G", (int) EG(precision), Z_DVAL_P(zdata));
|
||||
smart_str_appendl(formstr, ekey, ekey_len);
|
||||
efree(ekey);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* fall back on convert to string */
|
||||
ZVAL_DUP(©zval, zdata);
|
||||
convert_to_string_ex(©zval);
|
||||
if (enc_type == PHP_QUERY_RFC3986) {
|
||||
ekey = php_raw_url_encode(Z_STRVAL(copyzval), Z_STRLEN(copyzval), &ekey_len);
|
||||
} else {
|
||||
ekey = php_url_encode(Z_STRVAL(copyzval), Z_STRLEN(copyzval), &ekey_len);
|
||||
{
|
||||
zend_string *ekey;
|
||||
/* fall back on convert to string */
|
||||
ZVAL_DUP(©zval, zdata);
|
||||
convert_to_string_ex(©zval);
|
||||
if (enc_type == PHP_QUERY_RFC3986) {
|
||||
ekey = php_raw_url_encode(Z_STRVAL(copyzval), Z_STRLEN(copyzval));
|
||||
} else {
|
||||
ekey = php_url_encode(Z_STRVAL(copyzval), Z_STRLEN(copyzval));
|
||||
}
|
||||
smart_str_appendl(formstr, ekey->val, ekey->len);
|
||||
zval_ptr_dtor(©zval);
|
||||
STR_FREE(ekey);
|
||||
}
|
||||
zval_ptr_dtor(©zval);
|
||||
}
|
||||
smart_str_appendl(formstr, ekey, ekey_len);
|
||||
efree(ekey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+43
-56
@@ -485,15 +485,17 @@ static unsigned char hexchars[] = "0123456789ABCDEF";
|
||||
|
||||
/* {{{ php_url_encode
|
||||
*/
|
||||
PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
|
||||
PHPAPI zend_string *php_url_encode(char const *s, int len)
|
||||
{
|
||||
register unsigned char c;
|
||||
unsigned char *to, *start;
|
||||
unsigned char *to;
|
||||
unsigned char const *from, *end;
|
||||
zend_string *start;
|
||||
|
||||
from = (unsigned char *)s;
|
||||
end = (unsigned char *)s + len;
|
||||
start = to = (unsigned char *) safe_emalloc(3, len, 1);
|
||||
start = STR_ALLOC(3 * len, 0);
|
||||
to = (unsigned char*)start->val;
|
||||
|
||||
while (from < end) {
|
||||
c = *from++;
|
||||
@@ -521,11 +523,11 @@ PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
|
||||
*to++ = c;
|
||||
}
|
||||
}
|
||||
*to = 0;
|
||||
if (new_length) {
|
||||
*new_length = to - start;
|
||||
}
|
||||
return (char *) start;
|
||||
*to = '\0';
|
||||
|
||||
start = STR_REALLOC(start, to - (unsigned char*)start->val, 0);
|
||||
|
||||
return start;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -533,17 +535,13 @@ PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
|
||||
URL-encodes string */
|
||||
PHP_FUNCTION(urlencode)
|
||||
{
|
||||
char *in_str, *out_str;
|
||||
int in_str_len, out_str_len;
|
||||
zend_string *in_str;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
|
||||
&in_str_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &in_str) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
out_str = php_url_encode(in_str, in_str_len, &out_str_len);
|
||||
//??? RETURN_STRINGL(out_str, out_str_len, 0);
|
||||
RETURN_STRINGL(out_str, out_str_len);
|
||||
RETURN_STR(php_url_encode(in_str->val, in_str->len));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -551,19 +549,16 @@ PHP_FUNCTION(urlencode)
|
||||
Decodes URL-encoded string */
|
||||
PHP_FUNCTION(urldecode)
|
||||
{
|
||||
char *in_str, *out_str;
|
||||
int in_str_len, out_str_len;
|
||||
zend_string *in_str, *out_str;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
|
||||
&in_str_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &in_str) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
out_str = estrndup(in_str, in_str_len);
|
||||
out_str_len = php_url_decode(out_str, in_str_len);
|
||||
out_str = STR_DUP(in_str, 0);
|
||||
out_str->len = php_url_decode(out_str->val, out_str->len);
|
||||
|
||||
//??? RETURN_STRINGL(out_str, out_str_len, 0);
|
||||
RETURN_STRINGL(out_str, out_str_len);
|
||||
RETURN_STR(out_str);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -600,35 +595,34 @@ PHPAPI int php_url_decode(char *str, int len)
|
||||
|
||||
/* {{{ php_raw_url_encode
|
||||
*/
|
||||
PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length)
|
||||
PHPAPI zend_string *php_raw_url_encode(char const *s, int len)
|
||||
{
|
||||
register int x, y;
|
||||
unsigned char *str;
|
||||
zend_string *str;
|
||||
|
||||
str = (unsigned char *) safe_emalloc(3, len, 1);
|
||||
str = STR_ALLOC(3 * len, 0);
|
||||
for (x = 0, y = 0; len--; x++, y++) {
|
||||
str[y] = (unsigned char) s[x];
|
||||
str->val[y] = (unsigned char) s[x];
|
||||
#ifndef CHARSET_EBCDIC
|
||||
if ((str[y] < '0' && str[y] != '-' && str[y] != '.') ||
|
||||
(str[y] < 'A' && str[y] > '9') ||
|
||||
(str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||
|
||||
(str[y] > 'z' && str[y] != '~')) {
|
||||
str[y++] = '%';
|
||||
str[y++] = hexchars[(unsigned char) s[x] >> 4];
|
||||
str[y] = hexchars[(unsigned char) s[x] & 15];
|
||||
if ((str->val[y] < '0' && str->val[y] != '-' && str->val[y] != '.') ||
|
||||
(str->val[y] < 'A' && str->val[y] > '9') ||
|
||||
(str->val[y] > 'Z' && str->val[y] < 'a' && str->val[y] != '_') ||
|
||||
(str->val[y] > 'z' && str->val[y] != '~')) {
|
||||
str->val[y++] = '%';
|
||||
str->val[y++] = hexchars[(unsigned char) s[x] >> 4];
|
||||
str->val[y] = hexchars[(unsigned char) s[x] & 15];
|
||||
#else /*CHARSET_EBCDIC*/
|
||||
if (!isalnum(str[y]) && strchr("_-.~", str[y]) != NULL) {
|
||||
str[y++] = '%';
|
||||
str[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
|
||||
str[y] = hexchars[os_toascii[(unsigned char) s[x]] & 15];
|
||||
if (!isalnum(str->val[y]) && str->valchr("_-.~", str->val[y]) != NULL) {
|
||||
str->val[y++] = '%';
|
||||
str->val[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
|
||||
str->val[y] = hexchars[os_toascii[(unsigned char) s[x]] & 15];
|
||||
#endif /*CHARSET_EBCDIC*/
|
||||
}
|
||||
}
|
||||
str[y] = '\0';
|
||||
if (new_length) {
|
||||
*new_length = y;
|
||||
}
|
||||
return ((char *) str);
|
||||
str->val[y] = '\0';
|
||||
str = STR_REALLOC(str, y, 0);
|
||||
|
||||
return str;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -636,17 +630,13 @@ PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length)
|
||||
URL-encodes string */
|
||||
PHP_FUNCTION(rawurlencode)
|
||||
{
|
||||
char *in_str, *out_str;
|
||||
int in_str_len, out_str_len;
|
||||
zend_string *in_str;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
|
||||
&in_str_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &in_str) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
out_str = php_raw_url_encode(in_str, in_str_len, &out_str_len);
|
||||
//??? RETURN_STRINGL(out_str, out_str_len, 0);
|
||||
RETURN_STRINGL(out_str, out_str_len);
|
||||
RETURN_STR(php_raw_url_encode(in_str->val, in_str->len));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -654,16 +644,13 @@ PHP_FUNCTION(rawurlencode)
|
||||
Decodes URL-encodes string */
|
||||
PHP_FUNCTION(rawurldecode)
|
||||
{
|
||||
char *in_str;
|
||||
int in_str_len;
|
||||
zend_string *out_str;
|
||||
zend_string *in_str, *out_str;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
|
||||
&in_str_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &in_str) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
out_str = STR_INIT(in_str, in_str_len, 0);
|
||||
out_str = STR_DUP(in_str, 0);
|
||||
out_str->len = php_raw_url_decode(out_str->val, out_str->len);
|
||||
|
||||
RETURN_STR(out_str);
|
||||
|
||||
+2
-2
@@ -36,8 +36,8 @@ PHPAPI php_url *php_url_parse(char const *str);
|
||||
PHPAPI php_url *php_url_parse_ex(char const *str, int length);
|
||||
PHPAPI int php_url_decode(char *str, int len); /* return value: length of decoded string */
|
||||
PHPAPI int php_raw_url_decode(char *str, int len); /* return value: length of decoded string */
|
||||
PHPAPI char *php_url_encode(char const *s, int len, int *new_length);
|
||||
PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length);
|
||||
PHPAPI zend_string *php_url_encode(char const *s, int len);
|
||||
PHPAPI zend_string *php_raw_url_encode(char const *s, int len);
|
||||
|
||||
PHP_FUNCTION(parse_url);
|
||||
PHP_FUNCTION(urlencode);
|
||||
|
||||
@@ -1018,9 +1018,8 @@ static void php_url_scanner_output_handler(char *output, uint output_len, char *
|
||||
|
||||
PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int value_len, int urlencode TSRMLS_DC)
|
||||
{
|
||||
char *encoded = NULL;
|
||||
int encoded_len;
|
||||
smart_str val;
|
||||
zend_string *encoded;
|
||||
|
||||
if (! BG(url_adapt_state_ex).active) {
|
||||
php_url_scanner_ex_activate(TSRMLS_C);
|
||||
@@ -1034,8 +1033,8 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
|
||||
}
|
||||
|
||||
if (urlencode) {
|
||||
encoded = php_url_encode(value, value_len, &encoded_len);
|
||||
smart_str_setl(&val, encoded, encoded_len);
|
||||
encoded = php_url_encode(value, value_len);
|
||||
smart_str_setl(&val, encoded->val, encoded->len);
|
||||
} else {
|
||||
smart_str_setl(&val, value, value_len);
|
||||
}
|
||||
@@ -1050,8 +1049,9 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
|
||||
smart_str_append(&BG(url_adapt_state_ex).form_app, &val);
|
||||
smart_str_appends(&BG(url_adapt_state_ex).form_app, "\" />");
|
||||
|
||||
if (urlencode)
|
||||
efree(encoded);
|
||||
if (urlencode) {
|
||||
STR_FREE(encoded);
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@@ -470,9 +470,8 @@ static void php_url_scanner_output_handler(char *output, uint output_len, char *
|
||||
|
||||
PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int value_len, int urlencode TSRMLS_DC)
|
||||
{
|
||||
char *encoded = NULL;
|
||||
int encoded_len;
|
||||
smart_str val;
|
||||
zend_string *encoded;
|
||||
|
||||
if (! BG(url_adapt_state_ex).active) {
|
||||
php_url_scanner_ex_activate(TSRMLS_C);
|
||||
@@ -486,8 +485,8 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
|
||||
}
|
||||
|
||||
if (urlencode) {
|
||||
encoded = php_url_encode(value, value_len, &encoded_len);
|
||||
smart_str_setl(&val, encoded, encoded_len);
|
||||
encoded = php_url_encode(value, value_len);
|
||||
smart_str_setl(&val, encoded->val, encoded->len);
|
||||
} else {
|
||||
smart_str_setl(&val, value, value_len);
|
||||
}
|
||||
@@ -502,8 +501,9 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
|
||||
smart_str_append(&BG(url_adapt_state_ex).form_app, &val);
|
||||
smart_str_appends(&BG(url_adapt_state_ex).form_app, "\" />");
|
||||
|
||||
if (urlencode)
|
||||
efree(encoded);
|
||||
if (urlencode) {
|
||||
STR_FREE(encoded);
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user