X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=66d616d080be6007a694095f890442c3d1f3224a;hp=20dc30da8d2629770946254ce5282c62562d66b1;hb=107576b154825ebac44f2cc08d97565a5349eca8;hpb=985d2372a8eb0038e3244496c3f13acede337bdc diff --git a/http_api.c b/http_api.c index 20dc30d..66d616d 100644 --- a/http_api.c +++ b/http_api.c @@ -36,7 +36,6 @@ #include "ext/standard/url.h" #include "ext/standard/base64.h" #include "ext/standard/php_string.h" -#include "ext/standard/php_smart_str.h" #include "ext/standard/php_lcg.h" #include "SAPI.h" @@ -125,7 +124,7 @@ static const struct time_zone { static int http_sort_q(const void *a, const void *b TSRMLS_DC); #define http_send_chunk(d, b, e, m) _http_send_chunk((d), (b), (e), (m) TSRMLS_CC) -static STATUS _http_send_chunk(const void *data, const size_t begin, const size_t end, const http_send_mode mode TSRMLS_DC); +static STATUS _http_send_chunk(const void *data, size_t begin, size_t end, http_send_mode mode TSRMLS_DC); static int check_day(char *day, size_t len); static int check_month(char *month); @@ -154,8 +153,7 @@ static int http_sort_q(const void *a, const void *b TSRMLS_DC) /* {{{ static STATUS http_send_chunk(const void *, size_t, size_t, http_send_mode) */ -static STATUS _http_send_chunk(const void *data, const size_t begin, - const size_t end, const http_send_mode mode TSRMLS_DC) +static STATUS _http_send_chunk(const void *data, size_t begin, size_t end, http_send_mode mode TSRMLS_DC) { long len = end - begin; @@ -284,11 +282,11 @@ static int check_tzone(char *tzone) } /* }}} */ -/* char *pretty_key(char *, int, int, int) */ -char *pretty_key(char *key, int key_len, int uctitle, int xhyphen) +/* char *pretty_key(char *, size_t, zend_bool, zebd_bool) */ +char *pretty_key(char *key, size_t key_len, zend_bool uctitle, zend_bool xhyphen) { if (key && key_len) { - int i, wasalpha; + unsigned i, wasalpha; if (wasalpha = isalpha(key[0])) { key[0] = uctitle ? toupper(key[0]) : tolower(key[0]); } @@ -520,8 +518,7 @@ PHP_HTTP_API time_t _http_parse_date(const char *date) /* }}} */ /* {{{ char *http_etag(void *, size_t, http_send_mode) */ -PHP_HTTP_API char *_http_etag(const void *data_ptr, const size_t data_len, - const http_send_mode data_mode TSRMLS_DC) +PHP_HTTP_API char *_http_etag(const void *data_ptr, size_t data_len, http_send_mode data_mode TSRMLS_DC) { char ssb_buf[128] = {0}; unsigned char digest[16]; @@ -564,7 +561,7 @@ PHP_HTTP_API char *_http_etag(const void *data_ptr, const size_t data_len, /* }}} */ /* {{{ time_t http_lmod(void *, http_send_mode) */ -PHP_HTTP_API time_t _http_lmod(const void *data_ptr, const http_send_mode data_mode TSRMLS_DC) +PHP_HTTP_API time_t _http_lmod(const void *data_ptr, http_send_mode data_mode TSRMLS_DC) { switch (data_mode) { @@ -597,7 +594,7 @@ PHP_HTTP_API time_t _http_lmod(const void *data_ptr, const http_send_mode data_m /* }}} */ /* {{{ STATUS http_send_status_header(int, char *) */ -PHP_HTTP_API STATUS _http_send_status_header(const int status, const char *header TSRMLS_DC) +PHP_HTTP_API STATUS _http_send_status_header(int status, const char *header TSRMLS_DC) { sapi_header_line h = {(char *) header, strlen(header), status}; return sapi_header_op(SAPI_HEADER_REPLACE, &h TSRMLS_CC); @@ -697,11 +694,10 @@ PHP_HTTP_API STATUS _http_start_ob_handler(php_output_handler_func_t handler_fun } /* }}} */ -/* {{{ int http_modified_match(char *, time_t) */ -PHP_HTTP_API int _http_modified_match_ex(const char *entry, const time_t t, - const int enforce_presence TSRMLS_DC) +/* {{{ zend_bool http_modified_match(char *, time_t) */ +PHP_HTTP_API zend_bool _http_modified_match_ex(const char *entry, time_t t, zend_bool enforce_presence TSRMLS_DC) { - int retval; + zend_bool retval; zval *zmodified; char *modified, *chr_ptr; @@ -717,13 +713,12 @@ PHP_HTTP_API int _http_modified_match_ex(const char *entry, const time_t t, } /* }}} */ -/* {{{ int http_etag_match(char *, char *) */ -PHP_HTTP_API int _http_etag_match_ex(const char *entry, const char *etag, - const int enforce_presence TSRMLS_DC) +/* {{{ zend_bool http_etag_match(char *, char *) */ +PHP_HTTP_API zend_bool _http_etag_match_ex(const char *entry, const char *etag, zend_bool enforce_presence TSRMLS_DC) { zval *zetag; char *quoted_etag; - STATUS result; + zend_bool result; HTTP_GSC(zetag, entry, !enforce_presence); @@ -745,7 +740,7 @@ PHP_HTTP_API int _http_etag_match_ex(const char *entry, const char *etag, /* }}} */ /* {{{ STATUS http_send_last_modified(int) */ -PHP_HTTP_API STATUS _http_send_last_modified(const time_t t TSRMLS_DC) +PHP_HTTP_API STATUS _http_send_last_modified(time_t t TSRMLS_DC) { char *date = NULL; if (date = http_date(t)) { @@ -762,9 +757,8 @@ PHP_HTTP_API STATUS _http_send_last_modified(const time_t t TSRMLS_DC) } /* }}} */ -/* {{{ static STATUS http_send_etag(char *, int) */ -PHP_HTTP_API STATUS _http_send_etag(const char *etag, - const int etag_len TSRMLS_DC) +/* {{{ STATUS http_send_etag(char *, size_t) */ +PHP_HTTP_API STATUS _http_send_etag(const char *etag, size_t etag_len TSRMLS_DC) { STATUS status; char *etag_header; @@ -792,8 +786,7 @@ PHP_HTTP_API STATUS _http_send_etag(const char *etag, /* }}} */ /* {{{ STATUS http_send_cache_control(char *, size_t) */ -PHP_HTTP_API STATUS _http_send_cache_control(const char *cache_control, - const size_t cc_len TSRMLS_DC) +PHP_HTTP_API STATUS _http_send_cache_control(const char *cache_control, size_t cc_len TSRMLS_DC) { STATUS status; char *cc_header = ecalloc(1, sizeof("Cache-Control: ") + cc_len); @@ -809,8 +802,7 @@ PHP_HTTP_API STATUS _http_send_cache_control(const char *cache_control, /* }}} */ /* {{{ STATUS http_send_content_type(char *, size_t) */ -PHP_HTTP_API STATUS _http_send_content_type(const char *content_type, - const size_t ct_len TSRMLS_DC) +PHP_HTTP_API STATUS _http_send_content_type(const char *content_type, size_t ct_len TSRMLS_DC) { STATUS status; char *ct_header; @@ -841,8 +833,7 @@ PHP_HTTP_API STATUS _http_send_content_type(const char *content_type, /* }}} */ /* {{{ STATUS http_send_content_disposition(char *, size_t, zend_bool) */ -PHP_HTTP_API STATUS _http_send_content_disposition(const char *filename, - const size_t f_len, const int send_inline TSRMLS_DC) +PHP_HTTP_API STATUS _http_send_content_disposition(const char *filename, size_t f_len, zend_bool send_inline TSRMLS_DC) { STATUS status; char *cd_header; @@ -864,8 +855,8 @@ PHP_HTTP_API STATUS _http_send_content_disposition(const char *filename, /* }}} */ /* {{{ STATUS http_cache_last_modified(time_t, time_t, char *, size_t) */ -PHP_HTTP_API STATUS _http_cache_last_modified(const time_t last_modified, - const time_t send_modified, const char *cache_control, const size_t cc_len TSRMLS_DC) +PHP_HTTP_API STATUS _http_cache_last_modified(time_t last_modified, + time_t send_modified, const char *cache_control, size_t cc_len TSRMLS_DC) { if (cc_len) { http_send_cache_control(cache_control, cc_len); @@ -884,8 +875,8 @@ PHP_HTTP_API STATUS _http_cache_last_modified(const time_t last_modified, /* }}} */ /* {{{ STATUS http_cache_etag(char *, size_t, char *, size_t) */ -PHP_HTTP_API STATUS _http_cache_etag(const char *etag, const size_t etag_len, - const char *cache_control, const size_t cc_len TSRMLS_DC) +PHP_HTTP_API STATUS _http_cache_etag(const char *etag, size_t etag_len, + const char *cache_control, size_t cc_len TSRMLS_DC) { if (cc_len) { http_send_cache_control(cache_control, cc_len); @@ -1059,7 +1050,8 @@ PHP_HTTP_API char *_http_negotiate_q(const char *entry, const HashTable *support { zval *zaccept, zdelim, zarray, zentries, **zentry, **zsupp; char *q_ptr = NULL, *key = NULL; - int i = 0, idx = 0; + int i = 0; + ulong idx = 0; double qual; HTTP_GSC(zaccept, entry, estrdup(def)); @@ -1090,20 +1082,22 @@ PHP_HTTP_API char *_http_negotiate_q(const char *entry, const HashTable *support zval_dtor(&zarray); zend_hash_sort(Z_ARRVAL(zentries), zend_qsort, http_sort_q, 0 TSRMLS_CC); - + FOREACH_HASH_KEY(Z_ARRVAL(zentries), key, idx) { if (key) { - return estrdup(key); + key = estrdup(key); + zval_dtor(&zentries); + return key; } } - + zval_dtor(&zentries); + return estrdup(def); } /* }}} */ /* {{{ http_range_status http_get_request_ranges(HashTable *ranges, size_t) */ -PHP_HTTP_API http_range_status _http_get_request_ranges(HashTable *ranges, - const size_t length TSRMLS_DC) +PHP_HTTP_API http_range_status _http_get_request_ranges(HashTable *ranges, size_t length TSRMLS_DC) { zval *zrange; char *range, c; @@ -1166,7 +1160,12 @@ PHP_HTTP_API http_range_status _http_get_request_ranges(HashTable *ranges, { /* "0-12345" */ case -10: - if (length <= end) { + /* "0-" */ + if (end == -1) { + return RANGE_NO; + } + /* "0-0" or overflow */ + if (end == -10 || length <= end) { return RANGE_ERR; } begin = 0; @@ -1174,7 +1173,8 @@ PHP_HTTP_API http_range_status _http_get_request_ranges(HashTable *ranges, /* "-12345" */ case -1: - if (length <= end) { + /* "-", "-0" or overflow */ + if (end == -1 || end == -10 || length <= end) { return RANGE_ERR; } begin = length - end; @@ -1185,6 +1185,11 @@ PHP_HTTP_API http_range_status _http_get_request_ranges(HashTable *ranges, default: switch (end) { + /* "12345-0" */ + case -10: + return RANGE_ERR; + break; + /* "12345-" */ case -1: if (length <= begin) { @@ -1230,7 +1235,7 @@ PHP_HTTP_API http_range_status _http_get_request_ranges(HashTable *ranges, /* }}} */ /* {{{ STATUS http_send_ranges(HashTable *, void *, size_t, http_send_mode) */ -PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, const size_t size, const http_send_mode mode TSRMLS_DC) +PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_t size, http_send_mode mode TSRMLS_DC) { long **begin, **end; zval **zrange; @@ -1305,8 +1310,7 @@ PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, const /* }}} */ /* {{{ STATUS http_send(void *, size_t, http_send_mode) */ -PHP_HTTP_API STATUS _http_send(const void *data_ptr, const size_t data_size, - const http_send_mode data_mode TSRMLS_DC) +PHP_HTTP_API STATUS _http_send(const void *data_ptr, size_t data_size, http_send_mode data_mode TSRMLS_DC) { HashTable ranges; http_range_status range_status; @@ -1344,7 +1348,7 @@ PHP_HTTP_API STATUS _http_send(const void *data_ptr, const size_t data_size, zend_hash_destroy(&ranges); return result; } - + zend_hash_destroy(&ranges); /* send 304 Not Modified if etag matches */ @@ -1359,7 +1363,7 @@ PHP_HTTP_API STATUS _http_send(const void *data_ptr, const size_t data_size, http_send_etag(etag, 32); etag_match = http_etag_match("HTTP_IF_NONE_MATCH", etag); efree(etag); - + if (etag_match) { return http_send_status(304); } @@ -1369,15 +1373,14 @@ PHP_HTTP_API STATUS _http_send(const void *data_ptr, const size_t data_size, if (http_modified_match("HTTP_IF_MODIFIED_SINCE", HTTP_G(lmod))) { return http_send_status(304); } - + /* send full entity */ return http_send_chunk(data_ptr, 0, data_size, data_mode); } /* }}} */ /* {{{ STATUS http_send_stream(php_stream *) */ -PHP_HTTP_API STATUS _http_send_stream_ex(php_stream *file, - zend_bool close_stream TSRMLS_DC) +PHP_HTTP_API STATUS _http_send_stream_ex(php_stream *file, zend_bool close_stream TSRMLS_DC) { STATUS status; @@ -1396,8 +1399,8 @@ PHP_HTTP_API STATUS _http_send_stream_ex(php_stream *file, /* }}} */ /* {{{ STATUS http_chunked_decode(char *, size_t, char **, size_t *) */ -PHP_HTTP_API STATUS _http_chunked_decode(const char *encoded, - const size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC) +PHP_HTTP_API STATUS _http_chunked_decode(const char *encoded, size_t encoded_len, + char **decoded, size_t *decoded_len TSRMLS_DC) { const char *e_ptr; char *d_ptr; @@ -1471,8 +1474,8 @@ PHP_HTTP_API STATUS _http_split_response(zval *response, zval *headers, zval *bo /* }}} */ /* {{{ STATUS http_split_response(char *, size_t, HashTable *, char **, size_t *) */ -PHP_HTTP_API STATUS _http_split_response_ex(char *response, - size_t response_len, HashTable *headers, char **body, size_t *body_len TSRMLS_DC) +PHP_HTTP_API STATUS _http_split_response_ex(char *response, size_t response_len, + HashTable *headers, char **body, size_t *body_len TSRMLS_DC) { char *header = response, *real_body = NULL; @@ -1495,8 +1498,8 @@ PHP_HTTP_API STATUS _http_split_response_ex(char *response, } /* }}} */ -/* {{{ STATUS http_parse_headers(char *, long, zval *) */ -PHP_HTTP_API STATUS _http_parse_headers_ex(char *header, int header_len, +/* {{{ STATUS http_parse_headers(char *, size_t, HashTable *, zend_bool) */ +PHP_HTTP_API STATUS _http_parse_headers_ex(char *header, size_t header_len, HashTable *headers, zend_bool prettify TSRMLS_DC) { char *colon = NULL, *line = NULL, *begin = header; @@ -1531,10 +1534,12 @@ PHP_HTTP_API STATUS _http_parse_headers_ex(char *header, int header_len, /* skip empty key */ if (header != colon) { - char *key = estrndup(header, colon - header); + zval **previous = NULL; + int keylen = colon - header; + char *key = estrndup(header, keylen); if (prettify) { - key = pretty_key(key, colon - header, 1, 1); + key = pretty_key(key, keylen, 1, 1); } value_len += line - colon - 1; @@ -1544,11 +1549,37 @@ PHP_HTTP_API STATUS _http_parse_headers_ex(char *header, int header_len, /* skip trailing ws */ while (isspace(colon[value_len - 1])) --value_len; - if (value_len < 1) { + /* if we already have got such a header make an array of those */ + if (SUCCESS == zend_hash_find(headers, key, keylen + 1, (void **) &previous)) { + /* already an array? - just add */ + if (Z_TYPE_PP(previous) == IS_ARRAY) { + if (value_len > 0) { + add_next_index_stringl(*previous, colon, value_len, 1); + } else { + add_next_index_stringl(*previous, "", 0, 1); + } + } else { + /* create the array */ + zval *new_array; + MAKE_STD_ZVAL(new_array); + array_init(new_array); + + add_next_index_stringl(new_array, Z_STRVAL_PP(previous), Z_STRLEN_PP(previous), 1); + if (value_len > 0) { + add_next_index_stringl(new_array, colon, value_len, 1); + } else { + add_next_index_stringl(new_array, "", 0, 1); + } + + add_assoc_zval(&array, key, new_array); + } + + previous = NULL; + } else if (value_len > 0) { + add_assoc_stringl(&array, key, colon, value_len, 1); + } else { /* hm, empty header? */ add_assoc_stringl(&array, key, "", 0, 1); - } else { - add_assoc_stringl(&array, key, colon, value_len, 1); } efree(key); } @@ -1570,6 +1601,78 @@ PHP_HTTP_API STATUS _http_parse_headers_ex(char *header, int header_len, } /* }}} */ +/* {{{ */ +PHP_HTTP_API STATUS _http_parse_cookie(const char *cookie, HashTable *values TSRMLS_DC) +{ + const char *key = cookie, *val = NULL; + int vallen = 0, keylen = 0, done = 0; + zval array; + + Z_ARRVAL(array) = values; + + if (!(val = strchr(cookie, '='))) { + return FAILURE; + } + +#define HTTP_COOKIE_VAL(array, k, str, len) \ + { \ + const char *encoded = str; \ + char *decoded = NULL; \ + int decoded_len = 0, encoded_len = len; \ + decoded = estrndup(encoded, encoded_len); \ + decoded_len = php_url_decode(decoded, encoded_len); \ + add_assoc_stringl(array, k, decoded, decoded_len, 0); \ + } +#define HTTP_COOKIE_FIXKEY() \ + { \ + while (isspace(*key)) ++key; \ + keylen = val - key; \ + while (isspace(key[keylen - 1])) --keylen; \ + } +#define HTTP_COOKIE_FIXVAL() \ + { \ + ++val; \ + while (isspace(*val)) ++val; \ + vallen = key - val; \ + while (isspace(val[vallen - 1])) --vallen; \ + } + + HTTP_COOKIE_FIXKEY(); + HTTP_COOKIE_VAL(&array, "name", key, keylen); + + /* just a name=value cookie */ + if (!(key = strchr(val, ';'))) { + key = val + strlen(val); + HTTP_COOKIE_FIXVAL(); + HTTP_COOKIE_VAL(&array, "value", val, vallen); + } + /* additional info appended */ + else { + char *keydup = NULL; + + HTTP_COOKIE_FIXVAL(); + HTTP_COOKIE_VAL(&array, "value", val, vallen); + + do { + if (!(val = strchr(key, '='))) { + break; + } + ++key; + HTTP_COOKIE_FIXKEY(); + keydup = estrndup(key, keylen); + if (!(key = strchr(val, ';'))) { + done = 1; + key = val + strlen(val); + } + HTTP_COOKIE_FIXVAL(); + HTTP_COOKIE_VAL(&array, keydup, val, vallen); + efree(keydup); + } while (!done); + } + return SUCCESS; +} +/* }}} */ + /* {{{ void http_get_request_headers_ex(HashTable *, zend_bool) */ PHP_HTTP_API void _http_get_request_headers_ex(HashTable *headers, zend_bool prettify TSRMLS_DC) { @@ -1596,42 +1699,30 @@ PHP_HTTP_API void _http_get_request_headers_ex(HashTable *headers, zend_bool pre } /* }}} */ -/* {{{ STATUS http_urlencode_hash_ex(HashTable *, int, char **, size_t *) */ -PHP_HTTP_API STATUS _http_urlencode_hash_ex(HashTable *hash, int override_argsep, +/* {{{ STATUS http_urlencode_hash_ex(HashTable *, zend_bool, char *, size_t, char **, size_t *) */ +PHP_HTTP_API STATUS _http_urlencode_hash_ex(HashTable *hash, zend_bool override_argsep, char *pre_encoded_data, size_t pre_encoded_len, char **encoded_data, size_t *encoded_len TSRMLS_DC) { - smart_str qstr = {0}; + char *arg_sep; + phpstr *qstr = phpstr_new(); - if (override_argsep) { - HTTP_URL_ARGSEP_OVERRIDE; + if (override_argsep || !strlen(arg_sep = INI_STR("arg_separator.output"))) { + arg_sep = HTTP_URL_ARGSEP_DEFAULT; } if (pre_encoded_len && pre_encoded_data) { - smart_str_appendl(&qstr, pre_encoded_data, pre_encoded_len); + phpstr_append(qstr, pre_encoded_data, pre_encoded_len); } - if (SUCCESS != php_url_encode_hash_ex(hash, &qstr, NULL, 0, NULL, 0, NULL, 0, NULL TSRMLS_CC)) { + if (SUCCESS != http_urlencode_hash_implementation(hash, qstr, arg_sep)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't encode query data"); - if (qstr.c) { - efree(qstr.c); - } - if (override_argsep) { - HTTP_URL_ARGSEP_RESTORE; - } + phpstr_free(qstr); return FAILURE; } - if (override_argsep) { - HTTP_URL_ARGSEP_RESTORE; - } - - smart_str_0(&qstr); - - *encoded_data = qstr.c; - if (encoded_len) { - *encoded_len = qstr.len; - } + phpstr_data(qstr, encoded_data, encoded_len); + phpstr_free(qstr); return SUCCESS; } @@ -1681,21 +1772,21 @@ PHP_HTTP_API STATUS _http_auth_credentials(char **user, char **pass TSRMLS_DC) } /* }}} */ -#ifndef ZEND_ENGINE_2 -/* {{{ php_url_encode_hash - Author: Sara Golemon */ -PHP_HTTP_API STATUS php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, +/* {{{ http_urlencode_hash_implementation + Original Author: Sara Golemon */ +PHP_HTTP_API STATUS _http_urlencode_hash_implementation_ex( + HashTable *ht, phpstr *formstr, char *arg_sep, const char *num_prefix, int num_prefix_len, const char *key_prefix, int key_prefix_len, const char *key_suffix, int key_suffix_len, zval *type TSRMLS_DC) { - char *arg_sep = NULL, *key = NULL, *ekey, *newprefix, *p; + char *key = NULL, *ekey, *newprefix, *p; int arg_sep_len, key_len, ekey_len, key_type, newprefix_len; ulong idx; zval **zdata = NULL, *copyzval; - if (!ht) { + if (!ht || !formstr) { return FAILURE; } @@ -1704,7 +1795,6 @@ PHP_HTTP_API STATUS php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, return SUCCESS; } - arg_sep = INI_STR("arg_separator.output"); if (!arg_sep || !strlen(arg_sep)) { arg_sep = HTTP_URL_ARGSEP_DEFAULT; } @@ -1788,33 +1878,34 @@ PHP_HTTP_API STATUS php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, *p = '\0'; } ht->nApplyCount++; - php_url_encode_hash_ex(HASH_OF(*zdata), formstr, NULL, 0, newprefix, newprefix_len, "]", 1, (Z_TYPE_PP(zdata) == IS_OBJECT ? *zdata : NULL) TSRMLS_CC); + http_urlencode_hash_implementation_ex(HASH_OF(*zdata), formstr, arg_sep, + NULL, 0, newprefix, newprefix_len, "]", 1, (Z_TYPE_PP(zdata) == IS_OBJECT ? *zdata : NULL)); ht->nApplyCount--; efree(newprefix); } else if (Z_TYPE_PP(zdata) == IS_NULL || Z_TYPE_PP(zdata) == IS_RESOURCE) { /* Skip these types */ continue; } else { - if (formstr->len) { - smart_str_appendl(formstr, arg_sep, arg_sep_len); + if (formstr->used) { + phpstr_append(formstr, arg_sep, arg_sep_len); } /* Simple key=value */ - smart_str_appendl(formstr, key_prefix, key_prefix_len); + phpstr_append(formstr, key_prefix, key_prefix_len); if (key_type == HASH_KEY_IS_STRING) { ekey = php_url_encode(key, key_len, &ekey_len); - smart_str_appendl(formstr, ekey, ekey_len); + phpstr_append(formstr, ekey, ekey_len); efree(ekey); } else { /* Numeric key */ if (num_prefix) { - smart_str_appendl(formstr, num_prefix, num_prefix_len); + phpstr_append(formstr, num_prefix, num_prefix_len); } ekey_len = spprintf(&ekey, 12, "%ld", idx); - smart_str_appendl(formstr, ekey, ekey_len); + phpstr_append(formstr, ekey, ekey_len); efree(ekey); } - smart_str_appendl(formstr, key_suffix, key_suffix_len); - smart_str_appendl(formstr, "=", 1); + phpstr_append(formstr, key_suffix, key_suffix_len); + phpstr_appends(formstr, "="); switch (Z_TYPE_PP(zdata)) { case IS_STRING: ekey = php_url_encode(Z_STRVAL_PP(zdata), Z_STRLEN_PP(zdata), &ekey_len); @@ -1835,7 +1926,7 @@ PHP_HTTP_API STATUS php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, ekey = php_url_encode(Z_STRVAL_P(copyzval), Z_STRLEN_P(copyzval), &ekey_len); zval_ptr_dtor(©zval); } - smart_str_appendl(formstr, ekey, ekey_len); + phpstr_append(formstr, ekey, ekey_len); efree(ekey); } } @@ -1843,7 +1934,6 @@ PHP_HTTP_API STATUS php_url_encode_hash_ex(HashTable *ht, smart_str *formstr, return SUCCESS; } /* }}} */ -#endif /* !ZEND_ENDGINE_2 */ /* }}} public API */