1
0
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:
Xinchen Hui
2014-03-03 16:34:43 +08:00
parent 8ca824d673
commit b07d5913dd
6 changed files with 121 additions and 110 deletions
+10 -11
View File
@@ -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
View File
@@ -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(&copyzval, zdata);
convert_to_string_ex(&copyzval);
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(&copyzval, zdata);
convert_to_string_ex(&copyzval);
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(&copyzval);
STR_FREE(ekey);
}
zval_ptr_dtor(&copyzval);
}
smart_str_appendl(formstr, ekey, ekey_len);
efree(ekey);
}
}
+43 -56
View File
@@ -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
View File
@@ -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);
+6 -6
View File
@@ -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;
}
+6 -6
View File
@@ -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;
}