diff options
author | Xinchen Hui <laruence@gmail.com> | 2014-03-03 16:34:43 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2014-03-03 16:34:43 +0800 |
commit | b07d5913dd734eae7a2fd4343ed040a71dd62fca (patch) | |
tree | 8215ef97ac80963886eedeb94a22b165ce9772e9 | |
parent | 8ca824d6731cbbdf9414e10a61de5dc59d51cb96 (diff) | |
download | php-git-b07d5913dd734eae7a2fd4343ed040a71dd62fca.tar.gz |
Refactor php_url_(en|de)code to return zend_string
-rw-r--r-- | ext/standard/head.c | 21 | ||||
-rw-r--r-- | ext/standard/http.c | 83 | ||||
-rw-r--r-- | ext/standard/url.c | 99 | ||||
-rw-r--r-- | ext/standard/url.h | 4 | ||||
-rw-r--r-- | ext/standard/url_scanner_ex.c | 12 | ||||
-rw-r--r-- | ext/standard/url_scanner_ex.re | 12 |
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(©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); } } 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; } |