#include "php_variables.h"
#include "zend_interfaces.h"
-#ifdef HAVE_ICONV
-# undef PHP_ATOM_INC
-# include "ext/iconv/php_iconv.h"
-# include "ext/standard/url.h"
-#endif
-
#include "php_http_api.h"
-#include "php_http_url_api.h"
+#include "php_http_querystring_api.h"
#include "php_http_querystring_object.h"
#include "php_http_exception_object.h"
}
ALLOC_HASHTABLE(OBJ_PROP(o));
- zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0);
+ zend_hash_init(OBJ_PROP(o), zend_hash_num_elements(&ce->default_properties), NULL, ZVAL_PTR_DTOR, 0);
zend_hash_copy(OBJ_PROP(o), &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
ov.handle = putObject(http_querystring_object, o);
}
/* {{{ querystring helpers */
-#define http_querystring_update(qa, qs) _http_querystring_update((qa), (qs) TSRMLS_CC)
-static inline void _http_querystring_update(zval *qarray, zval *qstring TSRMLS_DC);
-#define http_querystring_modify_array_ex(q, k, kl, pe) _http_querystring_modify_array_ex((q), (k), (kl), (pe) TSRMLS_CC)
-static inline int _http_querystring_modify_array_ex(zval *qarray, char *key, int keylen, zval *params_entry TSRMLS_DC);
-#define http_querystring_modify_array(q, p) _http_querystring_modify_array((q), (p) TSRMLS_CC)
-static inline int _http_querystring_modify_array(zval *qarray, zval *params TSRMLS_DC);
-#define http_querystring_modify(q, p) _http_querystring_modify((q), (p) TSRMLS_CC)
-static inline int _http_querystring_modify(zval *qarray, zval *params TSRMLS_DC);
-#define http_querystring_get(o, t, n, l, def, del, r) _http_querystring_get((o), (t), (n), (l), (def), (del), (r) TSRMLS_CC)
-static inline void _http_querystring_get(zval *this_ptr, int type, char *name, uint name_len, zval *defval, zend_bool del, zval *return_value TSRMLS_DC);
#ifndef WONKY
#define http_querystring_instantiate(g) _http_querystring_instantiate((g) TSRMLS_CC)
static inline zval *_http_querystring_instantiate(zend_bool global TSRMLS_DC)
return zobj;
}
#endif /* WONKY */
-static inline void _http_querystring_update(zval *qarray, zval *qstring TSRMLS_DC)
-{
- char *s = NULL;
- size_t l = 0;
-
- if (Z_TYPE_P(qarray) != IS_ARRAY) {
- convert_to_array(qarray);
- }
- if (SUCCESS == http_urlencode_hash_ex(Z_ARRVAL_P(qarray), 0, NULL, 0, &s, &l)) {
- zval_dtor(qstring);
- ZVAL_STRINGL(qstring, s, l, 0);
- } else {
- http_error(HE_WARNING, HTTP_E_QUERYSTRING, "Failed to update query string");
- }
-}
-static inline int _http_querystring_modify_array_ex(zval *qarray, char *key, int keylen, zval *params_entry TSRMLS_DC)
-{
- zval **qarray_entry;
-
- /* delete */
- if (Z_TYPE_P(params_entry) == IS_NULL) {
- return (SUCCESS == zend_hash_del(Z_ARRVAL_P(qarray), key, keylen));
- }
-
- /* update */
- if (SUCCESS == zend_hash_find(Z_ARRVAL_P(qarray), key, keylen, (void **) &qarray_entry)) {
- zval equal;
-
- /* recursive */
- if (Z_TYPE_P(params_entry) == IS_ARRAY) {
- return http_querystring_modify_array(*qarray_entry, params_entry);
- }
- /* equal */
- if ((SUCCESS == is_equal_function(&equal, *qarray_entry, params_entry TSRMLS_CC)) && Z_BVAL(equal)) {
- return 0;
- }
- }
-
- /* add */
- ZVAL_ADDREF(params_entry);
- add_assoc_zval_ex(qarray, key, keylen, params_entry);
- return 1;
-}
-static inline int _http_querystring_modify_array(zval *qarray, zval *params TSRMLS_DC)
-{
- int rv = 0;
- char *key;
- uint keylen;
- ulong idx;
- HashPosition pos;
- zval **params_entry;
-
- FOREACH_KEYLENVAL(pos, params, key, keylen, idx, params_entry) {
- if (key) {
- if (http_querystring_modify_array_ex(qarray, key, keylen, *params_entry)) {
- rv = 1;
- }
- } else {
- keylen = spprintf(&key, 0, "%lu", idx);
- if (http_querystring_modify_array_ex(qarray, key, keylen, *params_entry)) {
- rv = 1;
- }
- efree(key);
- }
- key = NULL;
- }
-
- return rv;
-}
-static inline int _http_querystring_modify(zval *qarray, zval *params TSRMLS_DC)
-{
- if (Z_TYPE_P(params) == IS_ARRAY) {
- return http_querystring_modify_array(qarray, params);
- } else if (Z_TYPE_P(params) == IS_OBJECT) {
- if (!instanceof_function(Z_OBJCE_P(params), http_querystring_object_ce TSRMLS_CC)) {
- zval temp_array;
- INIT_ZARR(temp_array, HASH_OF(params));
- return http_querystring_modify_array(qarray, &temp_array);
- }
- return http_querystring_modify_array(qarray, GET_PROP_EX(params, queryArray));
- } else {
- int rv;
- zval array;
-
- INIT_PZVAL(&array);
- array_init(&array);
-
- ZVAL_ADDREF(params);
- convert_to_string_ex(¶ms);
- sapi_module.treat_data(PARSE_STRING, estrdup(Z_STRVAL_P(params)), &array TSRMLS_CC);
- zval_ptr_dtor(¶ms);
- rv = http_querystring_modify_array(qarray, &array);
- zval_dtor(&array);
- return rv;
- }
-}
+
+#define http_querystring_get(o, t, n, l, def, del, r) _http_querystring_get((o), (t), (n), (l), (def), (del), (r) TSRMLS_CC)
static inline void _http_querystring_get(zval *this_ptr, int type, char *name, uint name_len, zval *defval, zend_bool del, zval *return_value TSRMLS_DC)
{
zval **arrval, *qarray = GET_PROP(queryArray);
- if ((Z_TYPE_P(qarray) == IS_ARRAY) && (SUCCESS == zend_hash_find(Z_ARRVAL_P(qarray), name, name_len + 1, (void **) &arrval))) {
+ if ((Z_TYPE_P(qarray) == IS_ARRAY) && (SUCCESS == zend_hash_find(Z_ARRVAL_P(qarray), name, name_len + 1, (void *) &arrval))) {
RETVAL_ZVAL(*arrval, 1, 0);
if (type) {
http_error(HE_ERROR, HTTP_E_QUERYSTRING, "The SAPI does not have a treat_data function registered");
} else if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|bz", &global, ¶ms)) {
if (global) {
- if ( (SUCCESS == zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &_SERVER)) &&
+#ifdef ZEND_ENGINE_2
+ zend_is_auto_global("_SERVER", lenof("_SERVER") TSRMLS_CC);
+#endif
+ if ( (SUCCESS == zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void *) &_SERVER)) &&
(Z_TYPE_PP(_SERVER) == IS_ARRAY) &&
- (SUCCESS == zend_hash_find(Z_ARRVAL_PP(_SERVER), "QUERY_STRING", sizeof("QUERY_STRING"), (void **) &QUERY_STRING))) {
+ (SUCCESS == zend_hash_find(Z_ARRVAL_PP(_SERVER), "QUERY_STRING", sizeof("QUERY_STRING"), (void *) &QUERY_STRING))) {
qstring = *QUERY_STRING;
-
- if ((SUCCESS == zend_hash_find(&EG(symbol_table), "_GET", sizeof("_GET"), (void **) &_GET)) && (Z_TYPE_PP(_GET) == IS_ARRAY)) {
+#ifdef ZEND_ENGINE_2
+ zend_is_auto_global("_GET", lenof("_GET") TSRMLS_CC);
+#endif
+ if ((SUCCESS == zend_hash_find(&EG(symbol_table), "_GET", sizeof("_GET"), (void *) &_GET)) && (Z_TYPE_PP(_GET) == IS_ARRAY)) {
qarray = *_GET;
} else {
http_error(HE_WARNING, HTTP_E_QUERYSTRING, "Could not acquire reference to superglobal GET array");
GET_PROP(queryArray)->is_ref = 1;
GET_PROP(queryString)->is_ref = 1;
- if (params && http_querystring_modify(GET_PROP(queryArray), params)) {
- http_querystring_update(GET_PROP(queryArray), GET_PROP(queryString));
+ if (params) {
+ http_querystring_modify(GET_PROP(queryArray), params);
}
+ http_querystring_update(GET_PROP(queryArray), GET_PROP(queryString));
}
} else {
qarray = ecalloc(1, sizeof(zval));
zval **zobj_ptr = NULL, *zobj = NULL;
if (Z_TYPE_P(instance) == IS_ARRAY) {
- if (SUCCESS == zend_hash_index_find(Z_ARRVAL_P(instance), global, (void **) &zobj_ptr)) {
+ if (SUCCESS == zend_hash_index_find(Z_ARRVAL_P(instance), global, (void *) &zobj_ptr)) {
RETVAL_ZVAL(*zobj_ptr, 1, 0);
} else {
zobj = http_querystring_instantiate(global);
*/
PHP_METHOD(HttpQueryString, xlate)
{
- char *ie, *oe, *er = NULL;
+ char *ie, *oe;
int ie_len, oe_len;
- size_t er_len = 0;
- zval *qa, *qs;
+ zval xa, *qa, *qs;
+ STATUS rs;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &ie, &ie_len, &oe, &oe_len)) {
RETURN_FALSE;
qa = GET_PROP(queryArray);
qs = GET_PROP(queryString);
- Z_STRLEN_P(qs) = php_url_decode(Z_STRVAL_P(qs), Z_STRLEN_P(qs));
- if (PHP_ICONV_ERR_SUCCESS == php_iconv_string(Z_STRVAL_P(qs), (size_t) Z_STRLEN_P(qs), &er, &er_len, oe, ie)) {
- efree(Z_STRVAL_P(qs));
- ZVAL_STRINGL(qs, er, er_len, 0);
- http_querystring_modify(qa, qs);
- RETVAL_TRUE;
- } else {
- http_error_ex(HE_WARNING, HTTP_E_QUERYSTRING, "Failed to convert '%.*s' from '%s' to '%s'", Z_STRLEN_P(qs), Z_STRVAL_P(qs), ie, oe);
- RETVAL_FALSE;
+ INIT_PZVAL(&xa);
+ array_init(&xa);
+
+ if (SUCCESS == (rs = http_querystring_xlate(&xa, qa, ie, oe))) {
+ zend_hash_clean(Z_ARRVAL_P(qa));
+ zend_hash_copy(Z_ARRVAL_P(qa), Z_ARRVAL(xa), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+ http_querystring_update(qa, qs);
}
- http_querystring_update(qa, qs);
+ zval_dtor(&xa);
+
+ RETURN_SUCCESS(rs);
}
/* }}} */
#endif /* HAVE_ICONV */