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 static int apply_querystring_filter(void *pData TSRMLS_DC
)
168 switch (Z_TYPE_PP(val
)) {
170 return ZEND_HASH_APPLY_REMOVE
;
173 zend_hash_apply(HASH_OF(*val
), apply_querystring_filter TSRMLS_CC
);
174 if (!zend_hash_num_elements(HASH_OF(*val
))) {
175 return ZEND_HASH_APPLY_REMOVE
;
182 return ZEND_HASH_APPLY_KEEP
;
185 ZEND_RESULT_CODE
php_http_querystring_parse(HashTable
*ht
, const char *str
, size_t len TSRMLS_DC
)
187 ZEND_RESULT_CODE rv
= FAILURE
;
188 php_http_params_opts_t opts
;
189 php_http_params_token_t psep
= { ZEND_STRL("&") }, *psepp
[] = { &psep
, NULL
};
190 php_http_params_token_t vsep
= { ZEND_STRL("=") }, *vsepp
[] = { &vsep
, NULL
};
191 const char *asi_str
= NULL
;
194 opts
.input
.str
= estrndup(str
, len
);
195 opts
.input
.len
= len
;
199 opts
.flags
= PHP_HTTP_PARAMS_QUERY
;
201 if (SUCCESS
== php_http_ini_entry(ZEND_STRL("arg_separator.input"), &asi_str
, &asi_len
, 0 TSRMLS_CC
) && asi_len
) {
205 array_init_size(arr
, asi_len
);
208 add_next_index_stringl(arr
, asi_str
++, 1, 1);
211 opts
.param
= php_http_params_separator_init(arr TSRMLS_CC
);
216 MAKE_STD_ZVAL(opts
.defval
);
217 ZVAL_TRUE(opts
.defval
);
219 if (php_http_params_parse(ht
, &opts TSRMLS_CC
)) {
220 zend_hash_apply(ht
, apply_querystring TSRMLS_CC
);
225 php_http_params_separator_free(opts
.param
);
228 zval_ptr_dtor(&opts
.defval
);
229 efree(opts
.input
.str
);
233 ZEND_RESULT_CODE
php_http_querystring_update(zval
*qarray
, zval
*params
, zval
*outstring TSRMLS_DC
)
235 /* enforce proper type */
236 if (Z_TYPE_P(qarray
) != IS_ARRAY
) {
237 convert_to_array(qarray
);
242 zend_hash_apply(Z_ARRVAL_P(qarray
), apply_querystring_filter TSRMLS_CC
);
246 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
247 zval
**params_entry
, **qarray_entry
;
248 zval zv
, *zv_ptr
= NULL
;
253 /* squeeze the hash out of the zval */
254 if (Z_TYPE_P(params
) == IS_OBJECT
&& instanceof_function(Z_OBJCE_P(params
), php_http_querystring_class_entry TSRMLS_CC
)) {
255 zv_ptr
= php_http_ztyp(IS_ARRAY
, zend_read_property(php_http_querystring_class_entry
, params
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
256 ptr
= Z_ARRVAL_P(zv_ptr
);
257 } else if (Z_TYPE_P(params
) == IS_OBJECT
|| Z_TYPE_P(params
) == IS_ARRAY
) {
258 ptr
= HASH_OF(params
);
260 zv_ptr
= php_http_ztyp(IS_STRING
, params
);
262 php_http_querystring_parse(Z_ARRVAL(zv
), Z_STRVAL_P(zv_ptr
), Z_STRLEN_P(zv_ptr
) TSRMLS_CC
);
263 zval_ptr_dtor(&zv_ptr
);
268 FOREACH_HASH_KEYVAL(pos
, ptr
, key
, params_entry
) {
269 /* only public properties */
270 if (key
.type
!= HASH_KEY_IS_STRING
|| *key
.str
) {
271 if (Z_TYPE_PP(params_entry
) == IS_NULL
) {
275 if (key
.type
== HASH_KEY_IS_STRING
) {
276 zend_hash_del(Z_ARRVAL_P(qarray
), key
.str
, key
.len
);
278 zend_hash_index_del(Z_ARRVAL_P(qarray
), key
.num
);
280 } else if ( ((key
.type
== HASH_KEY_IS_STRING
) && (SUCCESS
== zend_hash_find(Z_ARRVAL_P(qarray
), key
.str
, key
.len
, (void *) &qarray_entry
)))
281 || ((key
.type
== HASH_KEY_IS_LONG
) && (SUCCESS
== zend_hash_index_find(Z_ARRVAL_P(qarray
), key
.num
, (void *) &qarray_entry
)))) {
285 zval equal
, *entry
= NULL
;
288 if (Z_TYPE_PP(params_entry
) == IS_ARRAY
|| Z_TYPE_PP(params_entry
) == IS_OBJECT
) {
289 entry
= php_http_zsep(1, IS_ARRAY
, *qarray_entry
);
290 php_http_querystring_update(entry
, *params_entry
, NULL TSRMLS_CC
);
291 } else if ((FAILURE
== is_identical_function(&equal
, *qarray_entry
, *params_entry TSRMLS_CC
)) || !Z_BVAL(equal
)) {
292 Z_ADDREF_PP(params_entry
);
293 entry
= *params_entry
;
297 if (key
.type
== HASH_KEY_IS_STRING
) {
298 zend_hash_update(Z_ARRVAL_P(qarray
), key
.str
, key
.len
, (void *) &entry
, sizeof(zval
*), NULL
);
300 zend_hash_index_update(Z_ARRVAL_P(qarray
), key
.num
, (void *) &entry
, sizeof(zval
*), NULL
);
308 if (Z_TYPE_PP(params_entry
) == IS_OBJECT
) {
309 MAKE_STD_ZVAL(entry
);
311 php_http_querystring_update(entry
, *params_entry
, NULL TSRMLS_CC
);
313 Z_ADDREF_PP(params_entry
);
314 entry
= *params_entry
;
316 if (key
.type
== HASH_KEY_IS_STRING
) {
317 add_assoc_zval_ex(qarray
, key
.str
, key
.len
, entry
);
319 add_index_zval(qarray
, key
.num
, entry
);
326 zval_ptr_dtor(&zv_ptr
);
331 /* serialize to string */
336 if (SUCCESS
== php_http_url_encode_hash(Z_ARRVAL_P(qarray
), NULL
, 0, &s
, &l TSRMLS_CC
)) {
337 zval_dtor(outstring
);
338 ZVAL_STRINGL(outstring
, s
, l
, 0);
340 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to encode query string");
348 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString___construct
, 0, 0, 0)
349 ZEND_ARG_INFO(0, params
)
351 PHP_METHOD(HttpQueryString
, __construct
)
354 zend_error_handling zeh
;
356 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z", ¶ms
), invalid_arg
, return);
358 zend_replace_error_handling(EH_THROW
, php_http_exception_bad_querystring_class_entry
, &zeh TSRMLS_CC
);
359 php_http_querystring_set(getThis(), params
, 0 TSRMLS_CC
);
360 zend_restore_error_handling(&zeh TSRMLS_CC
);
363 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_getGlobalInstance
, 0, 0, 0)
365 PHP_METHOD(HttpQueryString
, getGlobalInstance
)
369 php_http_expect(SUCCESS
== zend_parse_parameters_none(), invalid_arg
, return);
371 instance
= *zend_std_get_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), 0 PHP_HTTP_ZEND_LITERAL_CCN TSRMLS_CC
);
373 if (Z_TYPE_P(instance
) != IS_OBJECT
) {
376 zend_is_auto_global("_GET", lenof("_GET") TSRMLS_CC
);
378 if ((SUCCESS
== zend_hash_find(&EG(symbol_table
), "_GET", sizeof("_GET"), (void *) &_GET
))
379 && (Z_TYPE_PP(_GET
) == IS_ARRAY
)
381 MAKE_STD_ZVAL(instance
);
382 ZVAL_OBJVAL(instance
, php_http_querystring_object_new(php_http_querystring_class_entry TSRMLS_CC
), 0);
384 SEPARATE_ZVAL_TO_MAKE_IS_REF(_GET
);
385 convert_to_array(*_GET
);
386 zend_update_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), *_GET TSRMLS_CC
);
388 zend_update_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), instance TSRMLS_CC
);
389 zval_ptr_dtor(&instance
);
391 php_http_throw(unexpected_val
, "Could not acquire reference to superglobal GET array", NULL
);
395 RETVAL_ZVAL(instance
, 1, 0);
398 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_getIterator
, 0, 0, 0)
400 PHP_METHOD(HttpQueryString
, getIterator
)
402 zval
*retval
= NULL
, *qa
;
404 php_http_expect(SUCCESS
== zend_parse_parameters_none(), invalid_arg
, return);
406 qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
408 object_init_ex(return_value
, spl_ce_RecursiveArrayIterator
);
409 zend_call_method_with_1_params(&return_value
, spl_ce_RecursiveArrayIterator
, NULL
, "__construct", &retval
, qa
);
411 zval_ptr_dtor(&retval
);
415 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_toString
, 0, 0, 0)
417 PHP_METHOD(HttpQueryString
, toString
)
419 if (SUCCESS
!= zend_parse_parameters_none()) {
422 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
425 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_toArray
, 0, 0, 0)
427 PHP_METHOD(HttpQueryString
, toArray
)
431 if (SUCCESS
!= zend_parse_parameters_none()) {
435 zqa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
436 RETURN_ZVAL(zqa
, 1, 0);
439 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_get
, 0, 0, 0)
440 ZEND_ARG_INFO(0, name
)
441 ZEND_ARG_INFO(0, type
)
442 ZEND_ARG_INFO(0, defval
)
443 ZEND_ARG_INFO(0, delete)
445 PHP_METHOD(HttpQueryString
, get
)
447 char *name_str
= NULL
;
451 zval
*ztype
= NULL
, *defval
= NULL
;
453 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|szzb", &name_str
, &name_len
, &ztype
, &defval
, &del
)) {
454 if (name_str
&& name_len
) {
456 if (Z_TYPE_P(ztype
) == IS_LONG
) {
457 type
= Z_LVAL_P(ztype
);
458 } else if(Z_TYPE_P(ztype
) == IS_STRING
) {
459 switch (Z_STRVAL_P(ztype
)[0]) {
461 case 'b': type
= PHP_HTTP_QUERYSTRING_TYPE_BOOL
; break;
465 case 'i': type
= PHP_HTTP_QUERYSTRING_TYPE_INT
; break;
469 case 'f': type
= PHP_HTTP_QUERYSTRING_TYPE_FLOAT
; break;
471 case 's': type
= PHP_HTTP_QUERYSTRING_TYPE_STRING
; break;
473 case 'a': type
= PHP_HTTP_QUERYSTRING_TYPE_ARRAY
; break;
475 case 'o': type
= PHP_HTTP_QUERYSTRING_TYPE_OBJECT
; break;
479 php_http_querystring_get(getThis(), type
, name_str
, name_len
, defval
, del
, return_value TSRMLS_CC
);
481 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
486 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_set
, 0, 0, 1)
487 ZEND_ARG_INFO(0, params
)
489 PHP_METHOD(HttpQueryString
, set
)
493 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", ¶ms
)) {
497 php_http_querystring_set(getThis(), params
, QS_MERGE TSRMLS_CC
);
498 RETVAL_ZVAL(getThis(), 1, 0);
501 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_mod
, 0, 0, 0)
502 ZEND_ARG_INFO(0, params
)
504 PHP_METHOD(HttpQueryString
, mod
)
507 zend_error_handling zeh
;
509 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", ¶ms
), invalid_arg
, return);
511 zend_replace_error_handling(EH_THROW
, php_http_exception_bad_querystring_class_entry
, &zeh TSRMLS_CC
);
512 ZVAL_OBJVAL(return_value
, Z_OBJ_HT_P(getThis())->clone_obj(getThis() TSRMLS_CC
), 0);
513 php_http_querystring_set(return_value
, params
, QS_MERGE TSRMLS_CC
);
514 zend_restore_error_handling(&zeh TSRMLS_CC
);
517 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString___getter
, 0, 0, 1)
518 ZEND_ARG_INFO(0, name
)
519 ZEND_ARG_INFO(0, defval
)
520 ZEND_ARG_INFO(0, delete)
522 #define PHP_HTTP_QUERYSTRING_GETTER(method, TYPE) \
523 PHP_METHOD(HttpQueryString, method) \
527 zval *defval = NULL; \
529 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zb", &name, &name_len, &defval, &del)) { \
530 php_http_querystring_get(getThis(), TYPE, name, name_len, defval, del, return_value TSRMLS_CC); \
533 PHP_HTTP_QUERYSTRING_GETTER(getBool
, IS_BOOL
);
534 PHP_HTTP_QUERYSTRING_GETTER(getInt
, IS_LONG
);
535 PHP_HTTP_QUERYSTRING_GETTER(getFloat
, IS_DOUBLE
);
536 PHP_HTTP_QUERYSTRING_GETTER(getString
, IS_STRING
);
537 PHP_HTTP_QUERYSTRING_GETTER(getArray
, IS_ARRAY
);
538 PHP_HTTP_QUERYSTRING_GETTER(getObject
, IS_OBJECT
);
540 #ifdef PHP_HTTP_HAVE_ICONV
541 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_xlate
, 0, 0, 2)
542 ZEND_ARG_INFO(0, from_encoding
)
543 ZEND_ARG_INFO(0, to_encoding
)
545 PHP_METHOD(HttpQueryString
, xlate
)
551 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &ie
, &ie_len
, &oe
, &oe_len
), invalid_arg
, return);
555 qa
= php_http_ztyp(IS_ARRAY
, zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
557 php_http_expect(SUCCESS
== php_http_querystring_xlate(na
, qa
, ie
, oe TSRMLS_CC
), bad_conversion
,
563 php_http_querystring_set(getThis(), na
, 0 TSRMLS_CC
);
564 RETVAL_ZVAL(getThis(), 1, 0);
569 #endif /* HAVE_ICONV */
571 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_serialize
, 0, 0, 0)
573 PHP_METHOD(HttpQueryString
, serialize
)
575 if (SUCCESS
!= zend_parse_parameters_none()) {
578 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
581 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_unserialize
, 0, 0, 1)
582 ZEND_ARG_INFO(0, serialized
)
584 PHP_METHOD(HttpQueryString
, unserialize
)
588 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", &serialized
)) {
592 if (Z_TYPE_P(serialized
) == IS_STRING
) {
593 php_http_querystring_set(getThis(), serialized
, 0 TSRMLS_CC
);
595 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Expected a string as parameter");
599 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetGet
, 0, 0, 1)
600 ZEND_ARG_INFO(0, offset
)
602 PHP_METHOD(HttpQueryString
, offsetGet
)
608 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
612 qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
614 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
615 if (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qa
), offset_str
, offset_len
+ 1, (void *) &value
)) {
616 RETVAL_ZVAL(*value
, 1, 0);
621 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetSet
, 0, 0, 2)
622 ZEND_ARG_INFO(0, offset
)
623 ZEND_ARG_INFO(0, value
)
625 PHP_METHOD(HttpQueryString
, offsetSet
)
631 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sz", &offset_str
, &offset_len
, &value
)) {
635 param
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
637 if (Z_TYPE_P(param
) == IS_ARRAY
&& zend_symtable_exists(Z_ARRVAL_P(param
), offset_str
, offset_len
+ 1)) {
639 zend_symtable_update(Z_ARRVAL_P(param
), offset_str
, offset_len
+ 1, (void *) &value
, sizeof(zval
*), NULL
);
642 MAKE_STD_ZVAL(param
);
645 add_assoc_zval_ex(param
, offset_str
, offset_len
+ 1, value
);
647 php_http_querystring_set(getThis(), param
, QS_MERGE TSRMLS_CC
);
648 zval_ptr_dtor(¶m
);
651 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetExists
, 0, 0, 1)
652 ZEND_ARG_INFO(0, offset
)
654 PHP_METHOD(HttpQueryString
, offsetExists
)
660 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
664 qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
666 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
667 if (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qa
), offset_str
, offset_len
+ 1, (void *) &value
)) {
668 RETURN_BOOL(Z_TYPE_PP(value
) != IS_NULL
);
674 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetUnset
, 0, 0, 1)
675 ZEND_ARG_INFO(0, offset
)
677 PHP_METHOD(HttpQueryString
, offsetUnset
)
683 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
687 MAKE_STD_ZVAL(param
);
689 add_assoc_null_ex(param
, offset_str
, offset_len
+ 1);
690 php_http_querystring_set(getThis(), param
, QS_MERGE TSRMLS_CC
);
691 zval_ptr_dtor(¶m
);
694 zend_class_entry
*php_http_querystring_class_entry
;
696 static zend_function_entry php_http_querystring_methods
[] = {
697 PHP_ME(HttpQueryString
, __construct
, ai_HttpQueryString___construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
|ZEND_ACC_FINAL
)
699 PHP_ME(HttpQueryString
, toArray
, ai_HttpQueryString_toArray
, ZEND_ACC_PUBLIC
)
700 PHP_ME(HttpQueryString
, toString
, ai_HttpQueryString_toString
, ZEND_ACC_PUBLIC
)
701 ZEND_MALIAS(HttpQueryString
, __toString
, toString
, ai_HttpQueryString_toString
, ZEND_ACC_PUBLIC
)
703 PHP_ME(HttpQueryString
, get
, ai_HttpQueryString_get
, ZEND_ACC_PUBLIC
)
704 PHP_ME(HttpQueryString
, set
, ai_HttpQueryString_set
, ZEND_ACC_PUBLIC
)
705 PHP_ME(HttpQueryString
, mod
, ai_HttpQueryString_mod
, ZEND_ACC_PUBLIC
)
707 PHP_ME(HttpQueryString
, getBool
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
708 PHP_ME(HttpQueryString
, getInt
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
709 PHP_ME(HttpQueryString
, getFloat
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
710 PHP_ME(HttpQueryString
, getString
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
711 PHP_ME(HttpQueryString
, getArray
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
712 PHP_ME(HttpQueryString
, getObject
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
714 PHP_ME(HttpQueryString
, getIterator
, ai_HttpQueryString_getIterator
, ZEND_ACC_PUBLIC
)
716 PHP_ME(HttpQueryString
, getGlobalInstance
, ai_HttpQueryString_getGlobalInstance
, ZEND_ACC_PUBLIC
|ZEND_ACC_STATIC
)
717 #ifdef PHP_HTTP_HAVE_ICONV
718 PHP_ME(HttpQueryString
, xlate
, ai_HttpQueryString_xlate
, ZEND_ACC_PUBLIC
)
721 /* Implements Serializable */
722 PHP_ME(HttpQueryString
, serialize
, ai_HttpQueryString_serialize
, ZEND_ACC_PUBLIC
)
723 PHP_ME(HttpQueryString
, unserialize
, ai_HttpQueryString_unserialize
, ZEND_ACC_PUBLIC
)
725 /* Implements ArrayAccess */
726 PHP_ME(HttpQueryString
, offsetGet
, ai_HttpQueryString_offsetGet
, ZEND_ACC_PUBLIC
)
727 PHP_ME(HttpQueryString
, offsetSet
, ai_HttpQueryString_offsetSet
, ZEND_ACC_PUBLIC
)
728 PHP_ME(HttpQueryString
, offsetExists
, ai_HttpQueryString_offsetExists
, ZEND_ACC_PUBLIC
)
729 PHP_ME(HttpQueryString
, offsetUnset
, ai_HttpQueryString_offsetUnset
, ZEND_ACC_PUBLIC
)
734 PHP_MINIT_FUNCTION(http_querystring
)
736 zend_class_entry ce
= {0};
738 INIT_NS_CLASS_ENTRY(ce
, "http", "QueryString", php_http_querystring_methods
);
739 php_http_querystring_class_entry
= zend_register_internal_class(&ce TSRMLS_CC
);
740 php_http_querystring_class_entry
->create_object
= php_http_querystring_object_new
;
741 zend_class_implements(php_http_querystring_class_entry TSRMLS_CC
, 3, zend_ce_serializable
, zend_ce_arrayaccess
, zend_ce_aggregate
);
743 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("instance"), (ZEND_ACC_STATIC
|ZEND_ACC_PRIVATE
) TSRMLS_CC
);
744 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("queryArray"), ZEND_ACC_PRIVATE TSRMLS_CC
);
746 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_BOOL"), PHP_HTTP_QUERYSTRING_TYPE_BOOL TSRMLS_CC
);
747 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_INT"), PHP_HTTP_QUERYSTRING_TYPE_INT TSRMLS_CC
);
748 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_FLOAT"), PHP_HTTP_QUERYSTRING_TYPE_FLOAT TSRMLS_CC
);
749 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_STRING"), PHP_HTTP_QUERYSTRING_TYPE_STRING TSRMLS_CC
);
750 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_ARRAY"), PHP_HTTP_QUERYSTRING_TYPE_ARRAY TSRMLS_CC
);
751 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_OBJECT"), PHP_HTTP_QUERYSTRING_TYPE_OBJECT TSRMLS_CC
);
761 * vim600: noet sw=4 ts=4 fdm=marker
762 * vim<600: noet sw=4 ts=4