2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2004-2014, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
13 #include "php_http_api.h"
15 #include "php_variables.h"
16 #include "ext/spl/spl_array.h"
18 #if PHP_HTTP_HAVE_ICONV
23 # include "ext/iconv/php_iconv.h"
26 static zend_class_entry
*php_http_querystring_class_entry
;
27 zend_class_entry
*php_http_querystring_get_class_entry(void)
29 return php_http_querystring_class_entry
;
34 static inline void php_http_querystring_set(zval
*instance
, zval
*params
, int flags
)
40 if (flags
& QS_MERGE
) {
41 zval old_tmp
, *old
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(instance
), ZEND_STRL("queryArray"), 0, &old_tmp
);
44 if (Z_TYPE_P(old
) == IS_ARRAY
) {
45 array_copy(Z_ARRVAL_P(old
), Z_ARRVAL(qa
));
49 php_http_querystring_update(&qa
, params
, NULL
);
50 zend_update_property(php_http_querystring_class_entry
, Z_OBJ_P(instance
), ZEND_STRL("queryArray"), &qa
);
54 static inline void php_http_querystring_str(zval
*instance
, zval
*return_value
)
56 zval qa_tmp
, *qa
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(instance
), ZEND_STRL("queryArray"), 0, &qa_tmp
);
59 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
60 php_http_querystring_update(qa
, NULL
, return_value
);
62 RETURN_EMPTY_STRING();
66 static inline void php_http_querystring_get(zval
*instance
, int type
, char *name
, uint32_t name_len
, zval
*defval
, zend_bool del
, zval
*return_value
)
68 zval
*arrval
, qarray_tmp
, *qarray
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(instance
), ZEND_STRL("queryArray"), 0, &qarray_tmp
);
71 if ((Z_TYPE_P(qarray
) == IS_ARRAY
) && (arrval
= zend_symtable_str_find(Z_ARRVAL_P(qarray
), name
, name_len
))) {
72 if (type
&& type
!= Z_TYPE_P(arrval
)) {
75 ZVAL_DUP(&tmp
, arrval
);
76 convert_to_explicit_type(&tmp
, type
);
77 RETVAL_ZVAL(&tmp
, 0, 0);
79 RETVAL_ZVAL(arrval
, 1, 0);
86 add_assoc_null_ex(&delarr
, name
, name_len
);
87 php_http_querystring_set(instance
, &delarr
, QS_MERGE
);
88 zval_ptr_dtor(&delarr
);
91 RETURN_ZVAL(defval
, 1, 0);
95 #if PHP_HTTP_HAVE_ICONV
96 ZEND_RESULT_CODE
php_http_querystring_xlate(zval
*dst
, zval
*src
, const char *ie
, const char *oe
)
99 zend_string
*xkey
, *xstr
;
100 php_http_arrkey_t key
;
102 ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(src
), key
.h
, key
.key
, entry
)
105 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(key
.key
->val
, key
.key
->len
, &xkey
, oe
, ie
)) {
106 php_error_docref(NULL
, E_WARNING
, "Failed to convert '%.*s' from '%s' to '%s'", (int) key
.key
->len
, key
.key
->val
, ie
, oe
);
111 if (Z_TYPE_P(entry
) == IS_STRING
) {
112 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(Z_STRVAL_P(entry
), Z_STRLEN_P(entry
), &xstr
, oe
, ie
)) {
114 zend_string_release(xkey
);
116 php_error_docref(NULL
, E_WARNING
, "Failed to convert '%.*s' from '%s' to '%s'", (int) Z_STRLEN_P(entry
), Z_STRVAL_P(entry
), ie
, oe
);
120 add_assoc_str_ex(dst
, xkey
->val
, xkey
->len
, xstr
);
122 add_index_str(dst
, key
.h
, xstr
);
124 } else if (Z_TYPE_P(entry
) == IS_ARRAY
) {
127 array_init(&subarray
);
129 add_assoc_zval_ex(dst
, xkey
->val
, xkey
->len
, &subarray
);
131 add_index_zval(dst
, key
.h
, &subarray
);
133 if (SUCCESS
!= php_http_querystring_xlate(&subarray
, entry
, ie
, oe
)) {
135 zend_string_release(xkey
);
142 zend_string_release(xkey
);
145 ZEND_HASH_FOREACH_END();
149 #endif /* HAVE_ICONV */
151 ZEND_RESULT_CODE
php_http_querystring_ctor(zval
*instance
, zval
*params
)
153 php_http_querystring_set(instance
, params
, 0);
157 static int apply_querystring(zval
*val
)
159 if (Z_TYPE_P(val
) == IS_ARRAY
) {
162 if ((zvalue
= zend_hash_str_find(Z_ARRVAL_P(val
), ZEND_STRL("value")))) {
165 ZVAL_COPY(&tmp
, zvalue
);
167 ZVAL_COPY_VALUE(val
, &tmp
);
171 return ZEND_HASH_APPLY_KEEP
;
174 static int apply_querystring_filter(zval
*val
)
176 switch (Z_TYPE_P(val
)) {
178 return ZEND_HASH_APPLY_REMOVE
;
181 zend_hash_apply(HASH_OF(val
), apply_querystring_filter
);
182 if (!zend_hash_num_elements(HASH_OF(val
))) {
183 return ZEND_HASH_APPLY_REMOVE
;
190 return ZEND_HASH_APPLY_KEEP
;
193 ZEND_RESULT_CODE
php_http_querystring_parse(HashTable
*ht
, const char *str
, size_t len
)
195 ZEND_RESULT_CODE rv
= FAILURE
;
196 php_http_params_opts_t opts
;
197 php_http_params_token_t psep
= { ZEND_STRL("&") }, *psepp
[] = { &psep
, NULL
};
198 php_http_params_token_t vsep
= { ZEND_STRL("=") }, *vsepp
[] = { &vsep
, NULL
};
199 const char *asi_str
= NULL
;
202 opts
.input
.str
= estrndup(str
, len
);
203 opts
.input
.len
= len
;
207 opts
.flags
= PHP_HTTP_PARAMS_QUERY
;
209 if (SUCCESS
== php_http_ini_entry(ZEND_STRL("arg_separator.input"), &asi_str
, &asi_len
, 0) && asi_len
) {
212 array_init_size(&arr
, asi_len
);
215 add_next_index_stringl(&arr
, asi_str
++, 1);
218 opts
.param
= php_http_params_separator_init(&arr
);
222 ZVAL_TRUE(&opts
.defval
);
224 if (php_http_params_parse(ht
, &opts
)) {
225 zend_hash_apply(ht
, apply_querystring
);
230 php_http_params_separator_free(opts
.param
);
233 zval_ptr_dtor(&opts
.defval
);
234 efree(opts
.input
.str
);
238 ZEND_RESULT_CODE
php_http_querystring_update(zval
*qarray
, zval
*params
, zval
*outstring
)
240 /* enforce proper type */
241 if (Z_TYPE_P(qarray
) != IS_ARRAY
) {
242 convert_to_array(qarray
);
247 zend_hash_apply(Z_ARRVAL_P(qarray
), apply_querystring_filter
);
250 php_http_arrkey_t key
;
251 zval zv
, *params_entry
, *qarray_entry
;
255 /* squeeze the hash out of the zval */
256 if (Z_TYPE_P(params
) == IS_OBJECT
&& instanceof_function(Z_OBJCE_P(params
), php_http_querystring_class_entry
)) {
257 zval qa_tmp
, *qa
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(params
), ZEND_STRL("queryArray"), 0, &qa_tmp
);
260 convert_to_array(qa
);
262 } else if (Z_TYPE_P(params
) == IS_OBJECT
|| Z_TYPE_P(params
) == IS_ARRAY
) {
263 ht
= HASH_OF(params
);
265 zend_string
*zs
= zval_get_string(params
);
268 php_http_querystring_parse(Z_ARRVAL(zv
), zs
->val
, zs
->len
);
269 zend_string_release(zs
);
274 ZEND_HASH_FOREACH_KEY_VAL_IND(ht
, key
.h
, key
.key
, params_entry
)
276 /* only public properties */
277 if (!key
.key
|| *key
.key
->val
) {
278 if (Z_TYPE_P(params_entry
) == IS_NULL
) {
283 zend_hash_del(Z_ARRVAL_P(qarray
), key
.key
);
285 zend_hash_index_del(Z_ARRVAL_P(qarray
), key
.h
);
287 } else if ( ((key
.key
) && (qarray_entry
= zend_hash_find(Z_ARRVAL_P(qarray
), key
.key
)))
288 || ((!key
.key
) && (qarray_entry
= zend_hash_index_find(Z_ARRVAL_P(qarray
), key
.h
)))) {
292 zval equal
, tmp
, *entry
= NULL
;
296 if (Z_TYPE_P(params_entry
) == IS_ARRAY
|| Z_TYPE_P(params_entry
) == IS_OBJECT
) {
297 ZVAL_DUP(&tmp
, qarray_entry
);
298 convert_to_array(&tmp
);
299 php_http_querystring_update(&tmp
, params_entry
, NULL
);
301 } else if ((FAILURE
== is_identical_function(&equal
, qarray_entry
, params_entry
)) || Z_TYPE(equal
) != IS_TRUE
) {
302 Z_TRY_ADDREF_P(params_entry
);
303 entry
= params_entry
;
307 zend_hash_update(Z_ARRVAL_P(qarray
), key
.key
, entry
? entry
: &tmp
);
309 zend_hash_index_update(Z_ARRVAL_P(qarray
), key
.h
, entry
? entry
: &tmp
);
312 zval entry
, *entry_ptr
= &entry
;
316 if (Z_TYPE_P(params_entry
) == IS_OBJECT
) {
318 php_http_querystring_update(&entry
, params_entry
, NULL
);
320 Z_TRY_ADDREF_P(params_entry
);
321 entry_ptr
= params_entry
;
324 add_assoc_zval_ex(qarray
, key
.key
->val
, key
.key
->len
, entry_ptr
);
326 add_index_zval(qarray
, key
.h
, entry_ptr
);
331 ZEND_HASH_FOREACH_END();
336 /* serialize to string */
341 if (SUCCESS
== php_http_url_encode_hash(Z_ARRVAL_P(qarray
), NULL
, 0, &s
, &l
)) {
342 zval_dtor(outstring
);
343 ZVAL_STR(outstring
, php_http_cs2zs(s
, l
));
345 php_error_docref(NULL
, E_WARNING
, "Failed to encode query string");
353 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString___construct
, 0, 0, 0)
354 ZEND_ARG_INFO(0, params
)
356 PHP_METHOD(HttpQueryString
, __construct
)
359 zend_error_handling zeh
;
361 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|z", ¶ms
), invalid_arg
, return);
363 zend_replace_error_handling(EH_THROW
, php_http_get_exception_bad_querystring_class_entry(), &zeh
);
364 php_http_querystring_set(getThis(), params
, 0);
365 zend_restore_error_handling(&zeh
);
368 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_getGlobalInstance
, 0, 0, 0)
370 PHP_METHOD(HttpQueryString
, getGlobalInstance
)
372 zval
*instance
, *_GET
;
374 php_http_expect(SUCCESS
== zend_parse_parameters_none(), invalid_arg
, return);
376 instance
= zend_read_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), 0);
378 if (Z_TYPE_P(instance
) == IS_OBJECT
) {
379 RETVAL_ZVAL(instance
, 1, 0);
380 } else if ((_GET
= php_http_env_get_superglobal(ZEND_STRL("_GET")))) {
382 zend_string
*qa_str
= zend_string_init(ZEND_STRL("queryArray"), 0);
384 ZVAL_OBJ(return_value
, php_http_querystring_object_new(php_http_querystring_class_entry
));
385 qa
= Z_OBJ_HT_P(return_value
)->get_property_ptr_ptr(Z_OBJ_P(return_value
), qa_str
, BP_VAR_RW
, NULL
);
386 zend_string_release(qa_str
);
388 ZVAL_NEW_REF(_GET
, _GET
);
391 zend_update_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), return_value
);
393 php_http_throw(unexpected_val
, "Could not acquire reference to superglobal GET array");
398 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(ai_HttpQueryString_getIterator
, 0, 0, Traversable
, 0)
400 PHP_METHOD(HttpQueryString
, getIterator
)
404 php_http_expect(SUCCESS
== zend_parse_parameters_none(), invalid_arg
, return);
406 qa
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(ZEND_THIS
), ZEND_STRL("queryArray"), 0, &qa_tmp
);
408 object_init_ex(return_value
, spl_ce_RecursiveArrayIterator
);
409 zend_call_method_with_1_params(Z_OBJ_P(return_value
), spl_ce_RecursiveArrayIterator
, NULL
, "__construct", NULL
, qa
);
412 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_toString
, 0, 0, 0)
414 PHP_METHOD(HttpQueryString
, toString
)
416 if (SUCCESS
!= zend_parse_parameters_none()) {
419 php_http_querystring_str(getThis(), return_value
);
422 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_toArray
, 0, 0, 0)
424 PHP_METHOD(HttpQueryString
, toArray
)
428 if (SUCCESS
!= zend_parse_parameters_none()) {
432 zqa
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(ZEND_THIS
), ZEND_STRL("queryArray"), 0, &zqa_tmp
);
433 RETURN_ZVAL(zqa
, 1, 0);
436 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_get
, 0, 0, 0)
437 ZEND_ARG_INFO(0, name
)
438 ZEND_ARG_INFO(0, type
)
439 ZEND_ARG_INFO(0, defval
)
440 ZEND_ARG_INFO(0, delete)
442 PHP_METHOD(HttpQueryString
, get
)
444 char *name_str
= NULL
;
448 zval
*ztype
= NULL
, *defval
= NULL
;
450 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|szzb", &name_str
, &name_len
, &ztype
, &defval
, &del
)) {
451 if (name_str
&& name_len
) {
453 if (Z_TYPE_P(ztype
) == IS_LONG
) {
454 type
= Z_LVAL_P(ztype
);
455 } else if(Z_TYPE_P(ztype
) == IS_STRING
) {
456 switch (Z_STRVAL_P(ztype
)[0]) {
458 case 'b': type
= PHP_HTTP_QUERYSTRING_TYPE_BOOL
; break;
462 case 'i': type
= PHP_HTTP_QUERYSTRING_TYPE_INT
; break;
466 case 'f': type
= PHP_HTTP_QUERYSTRING_TYPE_FLOAT
; break;
468 case 's': type
= PHP_HTTP_QUERYSTRING_TYPE_STRING
; break;
470 case 'a': type
= PHP_HTTP_QUERYSTRING_TYPE_ARRAY
; break;
472 case 'o': type
= PHP_HTTP_QUERYSTRING_TYPE_OBJECT
; break;
476 php_http_querystring_get(getThis(), type
, name_str
, name_len
, defval
, del
, return_value
);
478 php_http_querystring_str(getThis(), return_value
);
483 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_set
, 0, 0, 1)
484 ZEND_ARG_INFO(0, params
)
486 PHP_METHOD(HttpQueryString
, set
)
490 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "z", ¶ms
)) {
494 php_http_querystring_set(getThis(), params
, QS_MERGE
);
495 RETVAL_ZVAL(getThis(), 1, 0);
498 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_mod
, 0, 0, 0)
499 ZEND_ARG_INFO(0, params
)
501 PHP_METHOD(HttpQueryString
, mod
)
503 zval qa_tmp
, *params
, *instance
= getThis();
504 zend_error_handling zeh
;
506 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "z", ¶ms
), invalid_arg
, return);
508 zend_replace_error_handling(EH_THROW
, php_http_get_exception_bad_querystring_class_entry(), &zeh
);
509 ZVAL_OBJ(return_value
, Z_OBJ_HT_P(instance
)->clone_obj(Z_OBJ_P(instance
)));
510 /* make sure we do not inherit the reference to _GET */
511 SEPARATE_ZVAL(zend_read_property(Z_OBJCE_P(return_value
), Z_OBJ_P(return_value
), ZEND_STRL("queryArray"), 0, &qa_tmp
));
512 php_http_querystring_set(return_value
, params
, QS_MERGE
);
513 zend_restore_error_handling(&zeh
);
516 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString___getter
, 0, 0, 1)
517 ZEND_ARG_INFO(0, name
)
518 ZEND_ARG_INFO(0, defval
)
519 ZEND_ARG_INFO(0, delete)
521 #define PHP_HTTP_QUERYSTRING_GETTER(method, TYPE) \
522 PHP_METHOD(HttpQueryString, method) \
526 zval *defval = NULL; \
528 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS(), "s|zb", &name, &name_len, &defval, &del)) { \
529 php_http_querystring_get(getThis(), TYPE, name, name_len, defval, del, return_value); \
532 PHP_HTTP_QUERYSTRING_GETTER(getBool
, _IS_BOOL
);
533 PHP_HTTP_QUERYSTRING_GETTER(getInt
, IS_LONG
);
534 PHP_HTTP_QUERYSTRING_GETTER(getFloat
, IS_DOUBLE
);
535 PHP_HTTP_QUERYSTRING_GETTER(getString
, IS_STRING
);
536 PHP_HTTP_QUERYSTRING_GETTER(getArray
, IS_ARRAY
);
537 PHP_HTTP_QUERYSTRING_GETTER(getObject
, IS_OBJECT
);
539 #if PHP_HTTP_HAVE_ICONV
540 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_xlate
, 0, 0, 2)
541 ZEND_ARG_INFO(0, from_encoding
)
542 ZEND_ARG_INFO(0, to_encoding
)
544 PHP_METHOD(HttpQueryString
, xlate
)
547 size_t ie_len
, oe_len
;
548 zval na
, qa_tmp
, *qa
;
550 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &ie
, &ie_len
, &oe
, &oe_len
), invalid_arg
, return);
553 qa
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(ZEND_THIS
), ZEND_STRL("queryArray"), 0, &qa_tmp
);
555 convert_to_array(qa
);
557 php_http_expect(SUCCESS
== php_http_querystring_xlate(&na
, qa
, ie
, oe
), bad_conversion
,
562 php_http_querystring_set(getThis(), &na
, 0);
563 RETVAL_ZVAL(getThis(), 1, 0);
567 #endif /* HAVE_ICONV */
569 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(ai_HttpQueryString___serialize
, 0, 0, IS_ARRAY
, 0)
571 PHP_METHOD(HttpQueryString
, __serialize
)
575 zend_parse_parameters_none();
577 zqa
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(ZEND_THIS
), ZEND_STRL("queryArray"), 0, &zqa_tmp
);
578 RETURN_ZVAL(zqa
, 1, 0);
581 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(ai_HttpQueryString___unserialize
, 0, 1, IS_VOID
, 0)
582 ZEND_ARG_TYPE_INFO(0, data
, IS_ARRAY
, 0)
584 PHP_METHOD(HttpQueryString
, __unserialize
)
588 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "a", &qa
), invalid_arg
, return);
589 php_http_querystring_set(getThis(), qa
, 0);
592 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_serialize
, 0, 0, 0)
594 PHP_METHOD(HttpQueryString
, serialize
)
596 if (SUCCESS
!= zend_parse_parameters_none()) {
599 php_http_querystring_str(getThis(), return_value
);
602 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_unserialize
, 0, 0, 1)
603 ZEND_ARG_INFO(0, serialized
)
605 PHP_METHOD(HttpQueryString
, unserialize
)
609 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "z", &serialized
)) {
613 if (Z_TYPE_P(serialized
) == IS_STRING
) {
614 php_http_querystring_set(getThis(), serialized
, 0);
616 php_error_docref(NULL
, E_WARNING
, "Expected a string as parameter");
620 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(ai_HttpQueryString_offsetGet
, 0, 1, IS_MIXED
, 1)
621 ZEND_ARG_INFO(0, name
)
623 PHP_METHOD(HttpQueryString
, offsetGet
)
626 zval
*value
, qa_tmp
, *qa
;
628 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "S", &offset
)) {
632 qa
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(ZEND_THIS
), ZEND_STRL("queryArray"), 0, &qa_tmp
);
635 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
636 if ((value
= zend_symtable_find(Z_ARRVAL_P(qa
), offset
))) {
637 RETVAL_ZVAL(value
, 1, 0);
642 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(ai_HttpQueryString_offsetSet
, 0, 2, IS_VOID
, 0)
643 ZEND_ARG_INFO(0, name
)
644 ZEND_ARG_INFO(0, value
)
646 PHP_METHOD(HttpQueryString
, offsetSet
)
649 zval
*value
, param
, znull
;
651 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "Sz", &offset
, &value
)) {
655 array_init_size(¶m
, 1);
658 zend_symtable_update(Z_ARRVAL(param
), offset
, &znull
);
659 php_http_querystring_set(getThis(), ¶m
, QS_MERGE
);
660 /* then update, else QS_MERGE would merge sub-arrrays */
661 Z_TRY_ADDREF_P(value
);
662 zend_symtable_update(Z_ARRVAL(param
), offset
, value
);
663 php_http_querystring_set(getThis(), ¶m
, QS_MERGE
);
664 zval_ptr_dtor(¶m
);
667 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(ai_HttpQueryString_offsetExists
, 0, 1, _IS_BOOL
, 0)
668 ZEND_ARG_INFO(0, name
)
670 PHP_METHOD(HttpQueryString
, offsetExists
)
673 zval
*value
, qa_tmp
, *qa
;
675 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "S", &offset
)) {
679 qa
= zend_read_property(php_http_querystring_class_entry
, Z_OBJ_P(ZEND_THIS
), ZEND_STRL("queryArray"), 0, &qa_tmp
);
682 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
683 if ((value
= zend_symtable_find(Z_ARRVAL_P(qa
), offset
))) {
684 RETURN_BOOL(Z_TYPE_P(value
) != IS_NULL
);
690 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(ai_HttpQueryString_offsetUnset
, 0, 1, IS_VOID
, 0)
691 ZEND_ARG_INFO(0, name
)
693 PHP_METHOD(HttpQueryString
, offsetUnset
)
698 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "S", &offset
)) {
704 zend_symtable_update(Z_ARRVAL(param
), offset
, &znull
);
705 php_http_querystring_set(getThis(), ¶m
, QS_MERGE
);
706 zval_ptr_dtor(¶m
);
709 static zend_function_entry php_http_querystring_methods
[] = {
710 PHP_ME(HttpQueryString
, __construct
, ai_HttpQueryString___construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_FINAL
)
712 PHP_ME(HttpQueryString
, toArray
, ai_HttpQueryString_toArray
, ZEND_ACC_PUBLIC
)
713 PHP_ME(HttpQueryString
, toString
, ai_HttpQueryString_toString
, ZEND_ACC_PUBLIC
)
714 ZEND_MALIAS(HttpQueryString
, __toString
, toString
, ai_HttpQueryString_toString
, ZEND_ACC_PUBLIC
)
716 PHP_ME(HttpQueryString
, get
, ai_HttpQueryString_get
, ZEND_ACC_PUBLIC
)
717 PHP_ME(HttpQueryString
, set
, ai_HttpQueryString_set
, ZEND_ACC_PUBLIC
)
718 PHP_ME(HttpQueryString
, mod
, ai_HttpQueryString_mod
, ZEND_ACC_PUBLIC
)
720 PHP_ME(HttpQueryString
, getBool
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
721 PHP_ME(HttpQueryString
, getInt
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
722 PHP_ME(HttpQueryString
, getFloat
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
723 PHP_ME(HttpQueryString
, getString
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
724 PHP_ME(HttpQueryString
, getArray
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
725 PHP_ME(HttpQueryString
, getObject
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
727 PHP_ME(HttpQueryString
, getIterator
, ai_HttpQueryString_getIterator
, ZEND_ACC_PUBLIC
)
729 PHP_ME(HttpQueryString
, getGlobalInstance
, ai_HttpQueryString_getGlobalInstance
, ZEND_ACC_PUBLIC
|ZEND_ACC_STATIC
)
730 #if PHP_HTTP_HAVE_ICONV
731 PHP_ME(HttpQueryString
, xlate
, ai_HttpQueryString_xlate
, ZEND_ACC_PUBLIC
)
734 /* Implements Serializable */
735 PHP_ME(HttpQueryString
, serialize
, ai_HttpQueryString_serialize
, ZEND_ACC_PUBLIC
)
736 PHP_ME(HttpQueryString
, unserialize
, ai_HttpQueryString_unserialize
, ZEND_ACC_PUBLIC
)
737 PHP_ME(HttpQueryString
, __serialize
, ai_HttpQueryString___serialize
, ZEND_ACC_PUBLIC
)
738 PHP_ME(HttpQueryString
, __unserialize
, ai_HttpQueryString___unserialize
, ZEND_ACC_PUBLIC
)
740 /* Implements ArrayAccess */
741 PHP_ME(HttpQueryString
, offsetGet
, ai_HttpQueryString_offsetGet
, ZEND_ACC_PUBLIC
)
742 PHP_ME(HttpQueryString
, offsetSet
, ai_HttpQueryString_offsetSet
, ZEND_ACC_PUBLIC
)
743 PHP_ME(HttpQueryString
, offsetExists
, ai_HttpQueryString_offsetExists
, ZEND_ACC_PUBLIC
)
744 PHP_ME(HttpQueryString
, offsetUnset
, ai_HttpQueryString_offsetUnset
, ZEND_ACC_PUBLIC
)
749 PHP_MINIT_FUNCTION(http_querystring
)
751 zend_class_entry ce
= {0};
753 INIT_NS_CLASS_ENTRY(ce
, "http", "QueryString", php_http_querystring_methods
);
754 php_http_querystring_class_entry
= zend_register_internal_class(&ce
);
755 php_http_querystring_class_entry
->create_object
= php_http_querystring_object_new
;
756 zend_class_implements(php_http_querystring_class_entry
, 3, zend_ce_serializable
, zend_ce_arrayaccess
, zend_ce_aggregate
);
758 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("instance"), (ZEND_ACC_STATIC
|ZEND_ACC_PRIVATE
));
759 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("queryArray"), ZEND_ACC_PRIVATE
);
761 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_BOOL"), PHP_HTTP_QUERYSTRING_TYPE_BOOL
);
762 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_INT"), PHP_HTTP_QUERYSTRING_TYPE_INT
);
763 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_FLOAT"), PHP_HTTP_QUERYSTRING_TYPE_FLOAT
);
764 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_STRING"), PHP_HTTP_QUERYSTRING_TYPE_STRING
);
765 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_ARRAY"), PHP_HTTP_QUERYSTRING_TYPE_ARRAY
);
766 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_OBJECT"), PHP_HTTP_QUERYSTRING_TYPE_OBJECT
);
776 * vim600: noet sw=4 ts=4 fdm=marker
777 * vim<600: noet sw=4 ts=4