X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=src%2Fphp_http_querystring.c;h=01d95f9f0ec91bd210fd2b15335a4fecc3cffac0;hp=ea84d8d1e6fed8a94a74113144218892a2849074;hb=700883ba05724a9dd14fa6d5a2eded658cf0496c;hpb=54059a470e850eb8380bde2a4ed117e25c1b3e95 diff --git a/src/php_http_querystring.c b/src/php_http_querystring.c index ea84d8d..01d95f9 100644 --- a/src/php_http_querystring.c +++ b/src/php_http_querystring.c @@ -12,15 +12,15 @@ #include "php_http_api.h" -#include -#include +#include "php_variables.h" +#include "ext/spl/spl_array.h" #ifdef PHP_HTTP_HAVE_ICONV # ifndef HAVE_ICONV # define HAVE_ICONV 1 # endif # undef PHP_ATOM_INC -# include +# include "ext/iconv/php_iconv.h" #endif static zend_class_entry *php_http_querystring_class_entry; @@ -160,7 +160,7 @@ static int apply_querystring(zval *val) zval *zvalue; if ((zvalue = zend_hash_str_find(Z_ARRVAL_P(val), ZEND_STRL("value")))) { - zval tmp; + zval tmp = {0}; ZVAL_COPY(&tmp, zvalue); zval_dtor(val); @@ -171,6 +171,25 @@ static int apply_querystring(zval *val) return ZEND_HASH_APPLY_KEEP; } +static int apply_querystring_filter(zval *val) +{ + switch (Z_TYPE_P(val)) { + case IS_NULL: + return ZEND_HASH_APPLY_REMOVE; + case IS_ARRAY: + case IS_OBJECT: + zend_hash_apply(HASH_OF(val), apply_querystring_filter); + if (!zend_hash_num_elements(HASH_OF(val))) { + return ZEND_HASH_APPLY_REMOVE; + } + break; + default: + break; + } + + return ZEND_HASH_APPLY_KEEP; +} + ZEND_RESULT_CODE php_http_querystring_parse(HashTable *ht, const char *str, size_t len) { ZEND_RESULT_CODE rv = FAILURE; @@ -200,7 +219,7 @@ ZEND_RESULT_CODE php_http_querystring_parse(HashTable *ht, const char *str, size zval_ptr_dtor(&arr); } - ZVAL_NULL(&opts.defval); + ZVAL_TRUE(&opts.defval); if (php_http_params_parse(ht, &opts)) { zend_hash_apply(ht, apply_querystring); @@ -224,7 +243,9 @@ ZEND_RESULT_CODE php_http_querystring_update(zval *qarray, zval *params, zval *o } /* modify qarray */ - if (params) { + if (!params) { + zend_hash_apply(Z_ARRVAL_P(qarray), apply_querystring_filter); + } else { HashTable *ht; php_http_arrkey_t key; zval zv, *params_entry, *qarray_entry; @@ -268,25 +289,24 @@ ZEND_RESULT_CODE php_http_querystring_update(zval *qarray, zval *params, zval *o /* * update */ - zval equal, tmp, *entry = &tmp; + zval equal, tmp, *entry = NULL; ZVAL_UNDEF(&tmp); /* recursive */ if (Z_TYPE_P(params_entry) == IS_ARRAY || Z_TYPE_P(params_entry) == IS_OBJECT) { - ZVAL_DUP(entry, qarray_entry); - convert_to_array(entry); - php_http_querystring_update(entry, params_entry, NULL); - } else if ((FAILURE == is_equal_function(&equal, qarray_entry, params_entry)) || Z_TYPE(equal) != IS_TRUE) { + ZVAL_DUP(&tmp, qarray_entry); + convert_to_array(&tmp); + php_http_querystring_update(&tmp, params_entry, NULL); + entry = &tmp; + } else if ((FAILURE == is_identical_function(&equal, qarray_entry, params_entry)) || Z_TYPE(equal) != IS_TRUE) { Z_TRY_ADDREF_P(params_entry); entry = params_entry; } - if (entry) { - if (key.key) { - zend_hash_update(Z_ARRVAL_P(qarray), key.key, entry); - } else { - zend_hash_index_update(Z_ARRVAL_P(qarray), key.h, entry); - } + if (key.key) { + zend_hash_update(Z_ARRVAL_P(qarray), key.key, entry ? entry : &tmp); + } else { + zend_hash_index_update(Z_ARRVAL_P(qarray), key.h, entry ? entry : &tmp); } } else { zval entry, *entry_ptr = &entry;