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 #ifdef PHP_HTTP_HAVE_ICONV
23 # include <ext/iconv/php_iconv.h>
28 static inline void php_http_querystring_set(zval
*instance
, zval
*params
, int flags TSRMLS_DC
)
32 if (flags
& QS_MERGE
) {
33 qa
= php_http_zsep(1, IS_ARRAY
, zend_read_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
39 php_http_querystring_update(qa
, params
, NULL TSRMLS_CC
);
40 zend_update_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), qa TSRMLS_CC
);
44 static inline void php_http_querystring_str(zval
*instance
, zval
*return_value TSRMLS_DC
)
46 zval
*qa
= zend_read_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
48 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
49 php_http_querystring_update(qa
, NULL
, return_value TSRMLS_CC
);
51 RETURN_EMPTY_STRING();
55 static inline void php_http_querystring_get(zval
*this_ptr
, int type
, char *name
, uint name_len
, zval
*defval
, zend_bool del
, zval
*return_value TSRMLS_DC
)
57 zval
**arrval
, *qarray
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
59 if ((Z_TYPE_P(qarray
) == IS_ARRAY
) && (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qarray
), name
, name_len
+ 1, (void *) &arrval
))) {
61 zval
*value
= php_http_ztyp(type
, *arrval
);
62 RETVAL_ZVAL(value
, 1, 1);
64 RETVAL_ZVAL(*arrval
, 1, 0);
70 MAKE_STD_ZVAL(delarr
);
72 add_assoc_null_ex(delarr
, name
, name_len
+ 1);
73 php_http_querystring_set(this_ptr
, delarr
, QS_MERGE TSRMLS_CC
);
74 zval_ptr_dtor(&delarr
);
77 RETURN_ZVAL(defval
, 1, 0);
81 #ifdef PHP_HTTP_HAVE_ICONV
82 ZEND_RESULT_CODE
php_http_querystring_xlate(zval
*dst
, zval
*src
, const char *ie
, const char *oe TSRMLS_DC
)
86 char *xlate_str
= NULL
, *xkey
;
87 size_t xlate_len
= 0, xlen
;
88 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
90 FOREACH_KEYVAL(pos
, src
, key
, entry
) {
91 if (key
.type
== HASH_KEY_IS_STRING
) {
92 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(key
.str
, key
.len
-1, &xkey
, &xlen
, oe
, ie
)) {
93 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to convert '%.*s' from '%s' to '%s'", key
.len
-1, key
.str
, ie
, oe
);
98 if (Z_TYPE_PP(entry
) == IS_STRING
) {
99 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(Z_STRVAL_PP(entry
), Z_STRLEN_PP(entry
), &xlate_str
, &xlate_len
, oe
, ie
)) {
100 if (key
.type
== HASH_KEY_IS_STRING
) {
103 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to convert '%.*s' from '%s' to '%s'", Z_STRLEN_PP(entry
), Z_STRVAL_PP(entry
), ie
, oe
);
106 if (key
.type
== HASH_KEY_IS_STRING
) {
107 add_assoc_stringl_ex(dst
, xkey
, xlen
+1, xlate_str
, xlate_len
, 0);
109 add_index_stringl(dst
, key
.num
, xlate_str
, xlate_len
, 0);
111 } else if (Z_TYPE_PP(entry
) == IS_ARRAY
) {
114 MAKE_STD_ZVAL(subarray
);
115 array_init(subarray
);
116 if (key
.type
== HASH_KEY_IS_STRING
) {
117 add_assoc_zval_ex(dst
, xkey
, xlen
+1, subarray
);
119 add_index_zval(dst
, key
.num
, subarray
);
121 if (SUCCESS
!= php_http_querystring_xlate(subarray
, *entry
, ie
, oe TSRMLS_CC
)) {
122 if (key
.type
== HASH_KEY_IS_STRING
) {
129 if (key
.type
== HASH_KEY_IS_STRING
) {
135 #endif /* HAVE_ICONV */
137 ZEND_RESULT_CODE
php_http_querystring_ctor(zval
*instance
, zval
*params TSRMLS_DC
)
139 php_http_querystring_set(instance
, params
, 0 TSRMLS_CC
);
143 static int apply_querystring(void *pData TSRMLS_DC
)
147 if (Z_TYPE_PP(val
) == IS_ARRAY
) {
150 if (SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("value"), (void *) &zvalue
)) {
156 Z_TYPE_P(tmp
) = IS_NULL
;
161 return ZEND_HASH_APPLY_KEEP
;
164 ZEND_RESULT_CODE
php_http_querystring_parse(HashTable
*ht
, const char *str
, size_t len TSRMLS_DC
)
166 ZEND_RESULT_CODE rv
= FAILURE
;
167 php_http_params_opts_t opts
;
168 php_http_params_token_t psep
= { ZEND_STRL("&") }, *psepp
[] = { &psep
, NULL
};
169 php_http_params_token_t vsep
= { ZEND_STRL("=") }, *vsepp
[] = { &vsep
, NULL
};
170 const char *asi_str
= NULL
;
173 opts
.input
.str
= estrndup(str
, len
);
174 opts
.input
.len
= len
;
178 opts
.flags
= PHP_HTTP_PARAMS_QUERY
;
180 if (SUCCESS
== php_http_ini_entry(ZEND_STRL("arg_separator.input"), &asi_str
, &asi_len
, 0 TSRMLS_CC
) && asi_len
) {
184 array_init_size(arr
, asi_len
);
187 add_next_index_stringl(arr
, asi_str
++, 1, 1);
190 opts
.param
= php_http_params_separator_init(arr TSRMLS_CC
);
195 MAKE_STD_ZVAL(opts
.defval
);
196 ZVAL_NULL(opts
.defval
);
198 if (php_http_params_parse(ht
, &opts TSRMLS_CC
)) {
199 zend_hash_apply(ht
, apply_querystring TSRMLS_CC
);
204 php_http_params_separator_free(opts
.param
);
207 zval_ptr_dtor(&opts
.defval
);
208 efree(opts
.input
.str
);
212 ZEND_RESULT_CODE
php_http_querystring_update(zval
*qarray
, zval
*params
, zval
*outstring TSRMLS_DC
)
214 /* enforce proper type */
215 if (Z_TYPE_P(qarray
) != IS_ARRAY
) {
216 convert_to_array(qarray
);
223 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
224 zval
**params_entry
, **qarray_entry
;
225 zval zv
, *zv_ptr
= NULL
;
230 /* squeeze the hash out of the zval */
231 if (Z_TYPE_P(params
) == IS_OBJECT
&& instanceof_function(Z_OBJCE_P(params
), php_http_querystring_class_entry TSRMLS_CC
)) {
232 zv_ptr
= php_http_ztyp(IS_ARRAY
, zend_read_property(php_http_querystring_class_entry
, params
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
233 ptr
= Z_ARRVAL_P(zv_ptr
);
234 } else if (Z_TYPE_P(params
) == IS_OBJECT
|| Z_TYPE_P(params
) == IS_ARRAY
) {
235 ptr
= HASH_OF(params
);
237 zv_ptr
= php_http_ztyp(IS_STRING
, params
);
239 php_http_querystring_parse(Z_ARRVAL(zv
), Z_STRVAL_P(zv_ptr
), Z_STRLEN_P(zv_ptr
) TSRMLS_CC
);
240 zval_ptr_dtor(&zv_ptr
);
245 FOREACH_HASH_KEYVAL(pos
, ptr
, key
, params_entry
) {
246 /* only public properties */
247 if (key
.type
!= HASH_KEY_IS_STRING
|| *key
.str
) {
248 if (Z_TYPE_PP(params_entry
) == IS_NULL
) {
252 if (key
.type
== HASH_KEY_IS_STRING
) {
253 zend_hash_del(Z_ARRVAL_P(qarray
), key
.str
, key
.len
);
255 zend_hash_index_del(Z_ARRVAL_P(qarray
), key
.num
);
257 } else if ( ((key
.type
== HASH_KEY_IS_STRING
) && (SUCCESS
== zend_hash_find(Z_ARRVAL_P(qarray
), key
.str
, key
.len
, (void *) &qarray_entry
)))
258 || ((key
.type
== HASH_KEY_IS_LONG
) && (SUCCESS
== zend_hash_index_find(Z_ARRVAL_P(qarray
), key
.num
, (void *) &qarray_entry
)))) {
262 zval equal
, *entry
= NULL
;
265 if (Z_TYPE_PP(params_entry
) == IS_ARRAY
|| Z_TYPE_PP(params_entry
) == IS_OBJECT
) {
266 entry
= php_http_zsep(1, IS_ARRAY
, *qarray_entry
);
267 php_http_querystring_update(entry
, *params_entry
, NULL TSRMLS_CC
);
268 } else if ((FAILURE
== is_equal_function(&equal
, *qarray_entry
, *params_entry TSRMLS_CC
)) || !Z_BVAL(equal
)) {
269 Z_ADDREF_PP(params_entry
);
270 entry
= *params_entry
;
274 if (key
.type
== HASH_KEY_IS_STRING
) {
275 zend_hash_update(Z_ARRVAL_P(qarray
), key
.str
, key
.len
, (void *) &entry
, sizeof(zval
*), NULL
);
277 zend_hash_index_update(Z_ARRVAL_P(qarray
), key
.num
, (void *) &entry
, sizeof(zval
*), NULL
);
285 if (Z_TYPE_PP(params_entry
) == IS_OBJECT
) {
286 MAKE_STD_ZVAL(entry
);
288 php_http_querystring_update(entry
, *params_entry
, NULL TSRMLS_CC
);
290 Z_ADDREF_PP(params_entry
);
291 entry
= *params_entry
;
293 if (key
.type
== HASH_KEY_IS_STRING
) {
294 add_assoc_zval_ex(qarray
, key
.str
, key
.len
, entry
);
296 add_index_zval(qarray
, key
.num
, entry
);
303 zval_ptr_dtor(&zv_ptr
);
308 /* serialize to string */
313 if (SUCCESS
== php_http_url_encode_hash(Z_ARRVAL_P(qarray
), NULL
, 0, &s
, &l TSRMLS_CC
)) {
314 zval_dtor(outstring
);
315 ZVAL_STRINGL(outstring
, s
, l
, 0);
317 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to encode query string");
325 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString___construct
, 0, 0, 0)
326 ZEND_ARG_INFO(0, params
)
328 PHP_METHOD(HttpQueryString
, __construct
)
331 zend_error_handling zeh
;
333 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z", ¶ms
), invalid_arg
, return);
335 zend_replace_error_handling(EH_THROW
, php_http_exception_bad_querystring_class_entry
, &zeh TSRMLS_CC
);
336 php_http_querystring_set(getThis(), params
, 0 TSRMLS_CC
);
337 zend_restore_error_handling(&zeh TSRMLS_CC
);
340 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_getGlobalInstance
, 0, 0, 0)
342 PHP_METHOD(HttpQueryString
, getGlobalInstance
)
346 php_http_expect(SUCCESS
== zend_parse_parameters_none(), invalid_arg
, return);
348 instance
= *zend_std_get_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), 0 PHP_HTTP_ZEND_LITERAL_CCN TSRMLS_CC
);
350 if (Z_TYPE_P(instance
) != IS_OBJECT
) {
353 zend_is_auto_global("_GET", lenof("_GET") TSRMLS_CC
);
355 if ((SUCCESS
== zend_hash_find(&EG(symbol_table
), "_GET", sizeof("_GET"), (void *) &_GET
))
356 && (Z_TYPE_PP(_GET
) == IS_ARRAY
)
358 MAKE_STD_ZVAL(instance
);
359 ZVAL_OBJVAL(instance
, php_http_querystring_object_new(php_http_querystring_class_entry TSRMLS_CC
), 0);
361 SEPARATE_ZVAL_TO_MAKE_IS_REF(_GET
);
362 convert_to_array(*_GET
);
363 zend_update_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), *_GET TSRMLS_CC
);
365 zend_update_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), instance TSRMLS_CC
);
366 zval_ptr_dtor(&instance
);
368 php_http_throw(unexpected_val
, "Could not acquire reference to superglobal GET array", NULL
);
372 RETVAL_ZVAL(instance
, 1, 0);
375 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_getIterator
, 0, 0, 0)
377 PHP_METHOD(HttpQueryString
, getIterator
)
379 zval
*retval
= NULL
, *qa
;
381 php_http_expect(SUCCESS
== zend_parse_parameters_none(), invalid_arg
, return);
383 qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
385 object_init_ex(return_value
, spl_ce_RecursiveArrayIterator
);
386 zend_call_method_with_1_params(&return_value
, spl_ce_RecursiveArrayIterator
, NULL
, "__construct", &retval
, qa
);
388 zval_ptr_dtor(&retval
);
392 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_toString
, 0, 0, 0)
394 PHP_METHOD(HttpQueryString
, toString
)
396 if (SUCCESS
!= zend_parse_parameters_none()) {
399 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
402 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_toArray
, 0, 0, 0)
404 PHP_METHOD(HttpQueryString
, toArray
)
408 if (SUCCESS
!= zend_parse_parameters_none()) {
412 zqa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
413 RETURN_ZVAL(zqa
, 1, 0);
416 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_get
, 0, 0, 0)
417 ZEND_ARG_INFO(0, name
)
418 ZEND_ARG_INFO(0, type
)
419 ZEND_ARG_INFO(0, defval
)
420 ZEND_ARG_INFO(0, delete)
422 PHP_METHOD(HttpQueryString
, get
)
424 char *name_str
= NULL
;
428 zval
*ztype
= NULL
, *defval
= NULL
;
430 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|szzb", &name_str
, &name_len
, &ztype
, &defval
, &del
)) {
431 if (name_str
&& name_len
) {
433 if (Z_TYPE_P(ztype
) == IS_LONG
) {
434 type
= Z_LVAL_P(ztype
);
435 } else if(Z_TYPE_P(ztype
) == IS_STRING
) {
436 switch (Z_STRVAL_P(ztype
)[0]) {
438 case 'b': type
= PHP_HTTP_QUERYSTRING_TYPE_BOOL
; break;
442 case 'i': type
= PHP_HTTP_QUERYSTRING_TYPE_INT
; break;
446 case 'f': type
= PHP_HTTP_QUERYSTRING_TYPE_FLOAT
; break;
448 case 's': type
= PHP_HTTP_QUERYSTRING_TYPE_STRING
; break;
450 case 'a': type
= PHP_HTTP_QUERYSTRING_TYPE_ARRAY
; break;
452 case 'o': type
= PHP_HTTP_QUERYSTRING_TYPE_OBJECT
; break;
456 php_http_querystring_get(getThis(), type
, name_str
, name_len
, defval
, del
, return_value TSRMLS_CC
);
458 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
463 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_set
, 0, 0, 1)
464 ZEND_ARG_INFO(0, params
)
466 PHP_METHOD(HttpQueryString
, set
)
470 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", ¶ms
)) {
474 php_http_querystring_set(getThis(), params
, QS_MERGE TSRMLS_CC
);
475 RETVAL_ZVAL(getThis(), 1, 0);
478 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_mod
, 0, 0, 0)
479 ZEND_ARG_INFO(0, params
)
481 PHP_METHOD(HttpQueryString
, mod
)
484 zend_error_handling zeh
;
486 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", ¶ms
), invalid_arg
, return);
488 zend_replace_error_handling(EH_THROW
, php_http_exception_bad_querystring_class_entry
, &zeh TSRMLS_CC
);
489 ZVAL_OBJVAL(return_value
, Z_OBJ_HT_P(getThis())->clone_obj(getThis() TSRMLS_CC
), 0);
490 php_http_querystring_set(return_value
, params
, QS_MERGE TSRMLS_CC
);
491 zend_restore_error_handling(&zeh TSRMLS_CC
);
494 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString___getter
, 0, 0, 1)
495 ZEND_ARG_INFO(0, name
)
496 ZEND_ARG_INFO(0, defval
)
497 ZEND_ARG_INFO(0, delete)
499 #define PHP_HTTP_QUERYSTRING_GETTER(method, TYPE) \
500 PHP_METHOD(HttpQueryString, method) \
504 zval *defval = NULL; \
506 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zb", &name, &name_len, &defval, &del)) { \
507 php_http_querystring_get(getThis(), TYPE, name, name_len, defval, del, return_value TSRMLS_CC); \
510 PHP_HTTP_QUERYSTRING_GETTER(getBool
, IS_BOOL
);
511 PHP_HTTP_QUERYSTRING_GETTER(getInt
, IS_LONG
);
512 PHP_HTTP_QUERYSTRING_GETTER(getFloat
, IS_DOUBLE
);
513 PHP_HTTP_QUERYSTRING_GETTER(getString
, IS_STRING
);
514 PHP_HTTP_QUERYSTRING_GETTER(getArray
, IS_ARRAY
);
515 PHP_HTTP_QUERYSTRING_GETTER(getObject
, IS_OBJECT
);
517 #ifdef PHP_HTTP_HAVE_ICONV
518 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_xlate
, 0, 0, 2)
519 ZEND_ARG_INFO(0, from_encoding
)
520 ZEND_ARG_INFO(0, to_encoding
)
522 PHP_METHOD(HttpQueryString
, xlate
)
528 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &ie
, &ie_len
, &oe
, &oe_len
), invalid_arg
, return);
532 qa
= php_http_ztyp(IS_ARRAY
, zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
534 php_http_expect(SUCCESS
== php_http_querystring_xlate(na
, qa
, ie
, oe TSRMLS_CC
), bad_conversion
,
540 php_http_querystring_set(getThis(), na
, 0 TSRMLS_CC
);
541 RETVAL_ZVAL(getThis(), 1, 0);
546 #endif /* HAVE_ICONV */
548 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_serialize
, 0, 0, 0)
550 PHP_METHOD(HttpQueryString
, serialize
)
552 if (SUCCESS
!= zend_parse_parameters_none()) {
555 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
558 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_unserialize
, 0, 0, 1)
559 ZEND_ARG_INFO(0, serialized
)
561 PHP_METHOD(HttpQueryString
, unserialize
)
565 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", &serialized
)) {
569 if (Z_TYPE_P(serialized
) == IS_STRING
) {
570 php_http_querystring_set(getThis(), serialized
, 0 TSRMLS_CC
);
572 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Expected a string as parameter");
576 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetGet
, 0, 0, 1)
577 ZEND_ARG_INFO(0, offset
)
579 PHP_METHOD(HttpQueryString
, offsetGet
)
585 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
589 qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
591 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
592 if (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qa
), offset_str
, offset_len
+ 1, (void *) &value
)) {
593 RETVAL_ZVAL(*value
, 1, 0);
598 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetSet
, 0, 0, 2)
599 ZEND_ARG_INFO(0, offset
)
600 ZEND_ARG_INFO(0, value
)
602 PHP_METHOD(HttpQueryString
, offsetSet
)
608 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sz", &offset_str
, &offset_len
, &value
)) {
612 param
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
614 if (Z_TYPE_P(param
) == IS_ARRAY
&& zend_symtable_exists(Z_ARRVAL_P(param
), offset_str
, offset_len
+ 1)) {
616 zend_symtable_update(Z_ARRVAL_P(param
), offset_str
, offset_len
+ 1, (void *) &value
, sizeof(zval
*), NULL
);
619 MAKE_STD_ZVAL(param
);
622 add_assoc_zval_ex(param
, offset_str
, offset_len
+ 1, value
);
624 php_http_querystring_set(getThis(), param
, QS_MERGE TSRMLS_CC
);
625 zval_ptr_dtor(¶m
);
628 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetExists
, 0, 0, 1)
629 ZEND_ARG_INFO(0, offset
)
631 PHP_METHOD(HttpQueryString
, offsetExists
)
637 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
641 qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
643 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
644 if (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qa
), offset_str
, offset_len
+ 1, (void *) &value
)) {
645 RETURN_BOOL(Z_TYPE_PP(value
) != IS_NULL
);
651 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetUnset
, 0, 0, 1)
652 ZEND_ARG_INFO(0, offset
)
654 PHP_METHOD(HttpQueryString
, offsetUnset
)
660 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
664 MAKE_STD_ZVAL(param
);
666 add_assoc_null_ex(param
, offset_str
, offset_len
+ 1);
667 php_http_querystring_set(getThis(), param
, QS_MERGE TSRMLS_CC
);
668 zval_ptr_dtor(¶m
);
671 zend_class_entry
*php_http_querystring_class_entry
;
673 static zend_function_entry php_http_querystring_methods
[] = {
674 PHP_ME(HttpQueryString
, __construct
, ai_HttpQueryString___construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
|ZEND_ACC_FINAL
)
676 PHP_ME(HttpQueryString
, toArray
, ai_HttpQueryString_toArray
, ZEND_ACC_PUBLIC
)
677 PHP_ME(HttpQueryString
, toString
, ai_HttpQueryString_toString
, ZEND_ACC_PUBLIC
)
678 ZEND_MALIAS(HttpQueryString
, __toString
, toString
, ai_HttpQueryString_toString
, ZEND_ACC_PUBLIC
)
680 PHP_ME(HttpQueryString
, get
, ai_HttpQueryString_get
, ZEND_ACC_PUBLIC
)
681 PHP_ME(HttpQueryString
, set
, ai_HttpQueryString_set
, ZEND_ACC_PUBLIC
)
682 PHP_ME(HttpQueryString
, mod
, ai_HttpQueryString_mod
, ZEND_ACC_PUBLIC
)
684 PHP_ME(HttpQueryString
, getBool
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
685 PHP_ME(HttpQueryString
, getInt
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
686 PHP_ME(HttpQueryString
, getFloat
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
687 PHP_ME(HttpQueryString
, getString
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
688 PHP_ME(HttpQueryString
, getArray
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
689 PHP_ME(HttpQueryString
, getObject
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
691 PHP_ME(HttpQueryString
, getIterator
, ai_HttpQueryString_getIterator
, ZEND_ACC_PUBLIC
)
693 PHP_ME(HttpQueryString
, getGlobalInstance
, ai_HttpQueryString_getGlobalInstance
, ZEND_ACC_PUBLIC
|ZEND_ACC_STATIC
)
694 #ifdef PHP_HTTP_HAVE_ICONV
695 PHP_ME(HttpQueryString
, xlate
, ai_HttpQueryString_xlate
, ZEND_ACC_PUBLIC
)
698 /* Implements Serializable */
699 PHP_ME(HttpQueryString
, serialize
, ai_HttpQueryString_serialize
, ZEND_ACC_PUBLIC
)
700 PHP_ME(HttpQueryString
, unserialize
, ai_HttpQueryString_unserialize
, ZEND_ACC_PUBLIC
)
702 /* Implements ArrayAccess */
703 PHP_ME(HttpQueryString
, offsetGet
, ai_HttpQueryString_offsetGet
, ZEND_ACC_PUBLIC
)
704 PHP_ME(HttpQueryString
, offsetSet
, ai_HttpQueryString_offsetSet
, ZEND_ACC_PUBLIC
)
705 PHP_ME(HttpQueryString
, offsetExists
, ai_HttpQueryString_offsetExists
, ZEND_ACC_PUBLIC
)
706 PHP_ME(HttpQueryString
, offsetUnset
, ai_HttpQueryString_offsetUnset
, ZEND_ACC_PUBLIC
)
711 PHP_MINIT_FUNCTION(http_querystring
)
713 zend_class_entry ce
= {0};
715 INIT_NS_CLASS_ENTRY(ce
, "http", "QueryString", php_http_querystring_methods
);
716 php_http_querystring_class_entry
= zend_register_internal_class(&ce TSRMLS_CC
);
717 php_http_querystring_class_entry
->create_object
= php_http_querystring_object_new
;
718 zend_class_implements(php_http_querystring_class_entry TSRMLS_CC
, 3, zend_ce_serializable
, zend_ce_arrayaccess
, zend_ce_aggregate
);
720 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("instance"), (ZEND_ACC_STATIC
|ZEND_ACC_PRIVATE
) TSRMLS_CC
);
721 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("queryArray"), ZEND_ACC_PRIVATE TSRMLS_CC
);
723 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_BOOL"), PHP_HTTP_QUERYSTRING_TYPE_BOOL TSRMLS_CC
);
724 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_INT"), PHP_HTTP_QUERYSTRING_TYPE_INT TSRMLS_CC
);
725 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_FLOAT"), PHP_HTTP_QUERYSTRING_TYPE_FLOAT TSRMLS_CC
);
726 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_STRING"), PHP_HTTP_QUERYSTRING_TYPE_STRING TSRMLS_CC
);
727 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_ARRAY"), PHP_HTTP_QUERYSTRING_TYPE_ARRAY TSRMLS_CC
);
728 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_OBJECT"), PHP_HTTP_QUERYSTRING_TYPE_OBJECT TSRMLS_CC
);
738 * vim600: noet sw=4 ts=4 fdm=marker
739 * vim<600: noet sw=4 ts=4