X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=src%2Fphp_http_querystring.c;h=d45cd49923b21ce2b17746ddf0f56b84765b8fc8;hp=5f4eff81a9a101414d4ffed647fcc9ae6c9a4f12;hb=43a9a6f8cb56e25c3770d652ce77045f89f68ca6;hpb=a5e66b221dbf5a52cc770f4d7f46f05fe88784ba diff --git a/src/php_http_querystring.c b/src/php_http_querystring.c index 5f4eff8..d45cd49 100644 --- a/src/php_http_querystring.c +++ b/src/php_http_querystring.c @@ -23,6 +23,12 @@ # include #endif +static zend_class_entry *php_http_querystring_class_entry; +zend_class_entry *php_http_querystring_get_class_entry(void) +{ + return php_http_querystring_class_entry; +} + #define QS_MERGE 1 static inline void php_http_querystring_set(zval *instance, zval *params, int flags) @@ -165,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; @@ -194,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); @@ -218,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; @@ -270,7 +297,7 @@ ZEND_RESULT_CODE php_http_querystring_update(zval *qarray, zval *params, zval *o 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) { + } 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; } @@ -334,7 +361,7 @@ PHP_METHOD(HttpQueryString, __construct) php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS(), "|z", ¶ms), invalid_arg, return); - zend_replace_error_handling(EH_THROW, php_http_exception_bad_querystring_class_entry, &zeh); + zend_replace_error_handling(EH_THROW, php_http_get_exception_bad_querystring_class_entry(), &zeh); php_http_querystring_set(getThis(), params, 0); zend_restore_error_handling(&zeh); } @@ -477,7 +504,7 @@ PHP_METHOD(HttpQueryString, mod) php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS(), "z", ¶ms), invalid_arg, return); - zend_replace_error_handling(EH_THROW, php_http_exception_bad_querystring_class_entry, &zeh); + zend_replace_error_handling(EH_THROW, php_http_get_exception_bad_querystring_class_entry(), &zeh); ZVAL_OBJ(return_value, Z_OBJ_HT_P(instance)->clone_obj(instance)); /* make sure we do not inherit the reference to _GET */ SEPARATE_ZVAL(zend_read_property(Z_OBJCE_P(return_value), return_value, ZEND_STRL("queryArray"), 0, &qa_tmp)); @@ -655,8 +682,6 @@ PHP_METHOD(HttpQueryString, offsetUnset) zval_ptr_dtor(¶m); } -zend_class_entry *php_http_querystring_class_entry; - static zend_function_entry php_http_querystring_methods[] = { PHP_ME(HttpQueryString, __construct, ai_HttpQueryString___construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR|ZEND_ACC_FINAL)