summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2014-03-03 16:34:43 +0800
committerXinchen Hui <laruence@gmail.com>2014-03-03 16:34:43 +0800
commitb07d5913dd734eae7a2fd4343ed040a71dd62fca (patch)
tree8215ef97ac80963886eedeb94a22b165ce9772e9
parent8ca824d6731cbbdf9414e10a61de5dc59d51cb96 (diff)
downloadphp-git-b07d5913dd734eae7a2fd4343ed040a71dd62fca.tar.gz
Refactor php_url_(en|de)code to return zend_string
-rw-r--r--ext/standard/head.c21
-rw-r--r--ext/standard/http.c83
-rw-r--r--ext/standard/url.c99
-rw-r--r--ext/standard/url.h4
-rw-r--r--ext/standard/url_scanner_ex.c12
-rw-r--r--ext/standard/url_scanner_ex.re12
6 files changed, 121 insertions, 110 deletions
diff --git a/ext/standard/head.c b/ext/standard/head.c
index d63f937623..2fa5e1fdad 100644
--- a/ext/standard/head.c
+++ b/ext/standard/head.c
@@ -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) {
diff --git a/ext/standard/http.c b/ext/standard/http.c
index 4263a5f03c..62437f82d6 100644
--- a/ext/standard/http.c
+++ b/ext/standard/http.c
@@ -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);
}
}
diff --git a/ext/standard/url.c b/ext/standard/url.c
index 33b70569ae..d280717d84 100644
--- a/ext/standard/url.c
+++ b/ext/standard/url.c
@@ -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);
diff --git a/ext/standard/url.h b/ext/standard/url.h
index 89b4b39cf9..d23f0a1f17 100644
--- a/ext/standard/url.h
+++ b/ext/standard/url.h
@@ -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);
diff --git a/ext/standard/url_scanner_ex.c b/ext/standard/url_scanner_ex.c
index d71c97a28d..71ebae0b66 100644
--- a/ext/standard/url_scanner_ex.c
+++ b/ext/standard/url_scanner_ex.c
@@ -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;
}
diff --git a/ext/standard/url_scanner_ex.re b/ext/standard/url_scanner_ex.re
index 8488e2bb9e..31224f0901 100644
--- a/ext/standard/url_scanner_ex.re
+++ b/ext/standard/url_scanner_ex.re
@@ -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;
}