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-2013, 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
20 # include <ext/iconv/php_iconv.h>
25 static inline void php_http_querystring_set(zval
*instance
, zval
*params
, int flags TSRMLS_DC
)
29 if (flags
& QS_MERGE
) {
30 qa
= php_http_zsep(1, IS_ARRAY
, zend_read_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
36 php_http_querystring_update(qa
, params
, NULL TSRMLS_CC
);
37 zend_update_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), qa TSRMLS_CC
);
41 static inline void php_http_querystring_str(zval
*instance
, zval
*return_value TSRMLS_DC
)
43 zval
*qa
= zend_read_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
45 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
46 php_http_querystring_update(qa
, NULL
, return_value TSRMLS_CC
);
48 RETURN_EMPTY_STRING();
52 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
)
54 zval
**arrval
, *qarray
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
56 if ((Z_TYPE_P(qarray
) == IS_ARRAY
) && (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qarray
), name
, name_len
+ 1, (void *) &arrval
))) {
58 zval
*value
= php_http_ztyp(type
, *arrval
);
59 RETVAL_ZVAL(value
, 1, 1);
61 RETVAL_ZVAL(*arrval
, 1, 0);
67 MAKE_STD_ZVAL(delarr
);
69 add_assoc_null_ex(delarr
, name
, name_len
+ 1);
70 php_http_querystring_set(this_ptr
, delarr
, QS_MERGE TSRMLS_CC
);
71 zval_ptr_dtor(&delarr
);
74 RETURN_ZVAL(defval
, 1, 0);
78 #ifdef PHP_HTTP_HAVE_ICONV
79 PHP_HTTP_API STATUS
php_http_querystring_xlate(zval
*dst
, zval
*src
, const char *ie
, const char *oe TSRMLS_DC
)
83 char *xlate_str
= NULL
, *xkey
;
84 size_t xlate_len
= 0, xlen
;
85 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
87 FOREACH_KEYVAL(pos
, src
, key
, entry
) {
88 if (key
.type
== HASH_KEY_IS_STRING
) {
89 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(key
.str
, key
.len
-1, &xkey
, &xlen
, oe
, ie
)) {
90 php_http_error(HE_WARNING
, PHP_HTTP_E_QUERYSTRING
, "Failed to convert '%.*s' from '%s' to '%s'", key
.len
-1, key
.str
, ie
, oe
);
95 if (Z_TYPE_PP(entry
) == IS_STRING
) {
96 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(Z_STRVAL_PP(entry
), Z_STRLEN_PP(entry
), &xlate_str
, &xlate_len
, oe
, ie
)) {
97 if (key
.type
== HASH_KEY_IS_STRING
) {
100 php_http_error(HE_WARNING
, PHP_HTTP_E_QUERYSTRING
, "Failed to convert '%.*s' from '%s' to '%s'", Z_STRLEN_PP(entry
), Z_STRVAL_PP(entry
), ie
, oe
);
103 if (key
.type
== HASH_KEY_IS_STRING
) {
104 add_assoc_stringl_ex(dst
, xkey
, xlen
+1, xlate_str
, xlate_len
, 0);
106 add_index_stringl(dst
, key
.num
, xlate_str
, xlate_len
, 0);
108 } else if (Z_TYPE_PP(entry
) == IS_ARRAY
) {
111 MAKE_STD_ZVAL(subarray
);
112 array_init(subarray
);
113 if (key
.type
== HASH_KEY_IS_STRING
) {
114 add_assoc_zval_ex(dst
, xkey
, xlen
+1, subarray
);
116 add_index_zval(dst
, key
.num
, subarray
);
118 if (SUCCESS
!= php_http_querystring_xlate(subarray
, *entry
, ie
, oe TSRMLS_CC
)) {
119 if (key
.type
== HASH_KEY_IS_STRING
) {
126 if (key
.type
== HASH_KEY_IS_STRING
) {
132 #endif /* HAVE_ICONV */
134 PHP_HTTP_API STATUS
php_http_querystring_ctor(zval
*instance
, zval
*params TSRMLS_DC
)
136 php_http_querystring_set(instance
, params
, 0 TSRMLS_CC
);
140 static int apply_querystring(void *pData TSRMLS_DC
)
144 if (Z_TYPE_PP(val
) == IS_ARRAY
) {
147 if (SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("value"), (void *) &zvalue
)) {
153 Z_TYPE_P(tmp
) = IS_NULL
;
158 return ZEND_HASH_APPLY_KEEP
;
161 PHP_HTTP_API STATUS
php_http_querystring_parse(HashTable
*ht
, const char *str
, size_t len TSRMLS_DC
)
164 php_http_params_opts_t opts
;
165 php_http_params_token_t psep
= { ZEND_STRL("&") }, *psepp
[] = { &psep
, NULL
};
166 php_http_params_token_t vsep
= { ZEND_STRL("=") }, *vsepp
[] = { &vsep
, NULL
};
167 const char *asi_str
= NULL
;
170 opts
.input
.str
= estrndup(str
, len
);
171 opts
.input
.len
= len
;
175 opts
.flags
= PHP_HTTP_PARAMS_QUERY
;
177 if (SUCCESS
== php_http_ini_entry(ZEND_STRL("arg_separator.input"), &asi_str
, &asi_len
, 0 TSRMLS_CC
) && asi_len
) {
181 array_init_size(arr
, asi_len
);
184 add_next_index_stringl(arr
, asi_str
++, 1, 1);
187 opts
.param
= php_http_params_separator_init(arr TSRMLS_CC
);
192 MAKE_STD_ZVAL(opts
.defval
);
193 ZVAL_NULL(opts
.defval
);
195 if (php_http_params_parse(ht
, &opts TSRMLS_CC
)) {
196 zend_hash_apply(ht
, apply_querystring TSRMLS_CC
);
201 php_http_params_separator_free(opts
.param
);
204 zval_ptr_dtor(&opts
.defval
);
205 efree(opts
.input
.str
);
209 PHP_HTTP_API STATUS
php_http_querystring_update(zval
*qarray
, zval
*params
, zval
*outstring TSRMLS_DC
)
211 /* enforce proper type */
212 if (Z_TYPE_P(qarray
) != IS_ARRAY
) {
213 convert_to_array(qarray
);
220 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
221 zval
**params_entry
, **qarray_entry
;
222 zval zv
, *zv_ptr
= NULL
;
227 /* squeeze the hash out of the zval */
228 if (Z_TYPE_P(params
) == IS_OBJECT
&& instanceof_function(Z_OBJCE_P(params
), php_http_querystring_class_entry TSRMLS_CC
)) {
229 zv_ptr
= php_http_ztyp(IS_ARRAY
, zend_read_property(php_http_querystring_class_entry
, params
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
230 ptr
= Z_ARRVAL_P(zv_ptr
);
231 } else if (Z_TYPE_P(params
) == IS_OBJECT
|| Z_TYPE_P(params
) == IS_ARRAY
) {
232 ptr
= HASH_OF(params
);
234 zv_ptr
= php_http_ztyp(IS_STRING
, params
);
236 php_http_querystring_parse(Z_ARRVAL(zv
), Z_STRVAL_P(zv_ptr
), Z_STRLEN_P(zv_ptr
) TSRMLS_CC
);
237 zval_ptr_dtor(&zv_ptr
);
242 FOREACH_HASH_KEYVAL(pos
, ptr
, key
, params_entry
) {
243 /* only public properties */
244 if (key
.type
!= HASH_KEY_IS_STRING
|| *key
.str
) {
245 if (Z_TYPE_PP(params_entry
) == IS_NULL
) {
249 if (key
.type
== HASH_KEY_IS_STRING
) {
250 zend_hash_del(Z_ARRVAL_P(qarray
), key
.str
, key
.len
);
252 zend_hash_index_del(Z_ARRVAL_P(qarray
), key
.num
);
254 } else if ( ((key
.type
== HASH_KEY_IS_STRING
) && (SUCCESS
== zend_hash_find(Z_ARRVAL_P(qarray
), key
.str
, key
.len
, (void *) &qarray_entry
)))
255 || ((key
.type
== HASH_KEY_IS_LONG
) && (SUCCESS
== zend_hash_index_find(Z_ARRVAL_P(qarray
), key
.num
, (void *) &qarray_entry
)))) {
259 zval equal
, *entry
= NULL
;
262 if (Z_TYPE_PP(params_entry
) == IS_ARRAY
|| Z_TYPE_PP(params_entry
) == IS_OBJECT
) {
263 entry
= php_http_zsep(1, IS_ARRAY
, *qarray_entry
);
264 php_http_querystring_update(entry
, *params_entry
, NULL TSRMLS_CC
);
265 } else if ((FAILURE
== is_equal_function(&equal
, *qarray_entry
, *params_entry TSRMLS_CC
)) || !Z_BVAL(equal
)) {
266 Z_ADDREF_PP(params_entry
);
267 entry
= *params_entry
;
271 if (key
.type
== HASH_KEY_IS_STRING
) {
272 zend_hash_update(Z_ARRVAL_P(qarray
), key
.str
, key
.len
, (void *) &entry
, sizeof(zval
*), NULL
);
274 zend_hash_index_update(Z_ARRVAL_P(qarray
), key
.num
, (void *) &entry
, sizeof(zval
*), NULL
);
282 if (Z_TYPE_PP(params_entry
) == IS_OBJECT
) {
283 MAKE_STD_ZVAL(entry
);
285 php_http_querystring_update(entry
, *params_entry
, NULL TSRMLS_CC
);
287 Z_ADDREF_PP(params_entry
);
288 entry
= *params_entry
;
290 if (key
.type
== HASH_KEY_IS_STRING
) {
291 add_assoc_zval_ex(qarray
, key
.str
, key
.len
, entry
);
293 add_index_zval(qarray
, key
.num
, entry
);
300 zval_ptr_dtor(&zv_ptr
);
305 /* serialize to string */
310 if (SUCCESS
== php_http_url_encode_hash(Z_ARRVAL_P(qarray
), NULL
, 0, &s
, &l TSRMLS_CC
)) {
311 zval_dtor(outstring
);
312 ZVAL_STRINGL(outstring
, s
, l
, 0);
314 php_http_error(HE_WARNING
, PHP_HTTP_E_QUERYSTRING
, "Failed to encode query string");
322 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString___construct
, 0, 0, 0)
323 ZEND_ARG_INFO(0, params
)
325 PHP_METHOD(HttpQueryString
, __construct
)
329 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
330 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z", ¶ms
)) {
331 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
332 php_http_querystring_set(getThis(), params
, 0 TSRMLS_CC
);
333 } end_error_handling();
335 } end_error_handling();
338 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_getGlobalInstance
, 0, 0, 0)
340 PHP_METHOD(HttpQueryString
, getGlobalInstance
)
342 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
343 if (SUCCESS
== zend_parse_parameters_none()) {
344 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
345 zval
*instance
= *zend_std_get_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), 0 PHP_HTTP_ZEND_LITERAL_CCN TSRMLS_CC
);
347 if (Z_TYPE_P(instance
) != IS_OBJECT
) {
350 zend_is_auto_global("_GET", lenof("_GET") TSRMLS_CC
);
352 if ((SUCCESS
== zend_hash_find(&EG(symbol_table
), "_GET", sizeof("_GET"), (void *) &_GET
))
353 && (Z_TYPE_PP(_GET
) == IS_ARRAY
)
355 MAKE_STD_ZVAL(instance
);
356 ZVAL_OBJVAL(instance
, php_http_querystring_object_new(php_http_querystring_class_entry TSRMLS_CC
), 0);
358 SEPARATE_ZVAL_TO_MAKE_IS_REF(_GET
);
359 convert_to_array(*_GET
);
360 zend_update_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), *_GET TSRMLS_CC
);
362 zend_update_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), instance TSRMLS_CC
);
363 zval_ptr_dtor(&instance
);
365 php_http_error(HE_WARNING
, PHP_HTTP_E_QUERYSTRING
, "Could not acquire reference to superglobal GET array");
368 RETVAL_ZVAL(instance
, 1, 0);
369 } end_error_handling();
371 } end_error_handling();
374 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_getIterator
, 0, 0, 0)
376 PHP_METHOD(HttpQueryString
, getIterator
)
378 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
379 if (SUCCESS
== zend_parse_parameters_none()) {
380 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
381 zval
*retval
= NULL
, *qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
383 object_init_ex(return_value
, spl_ce_RecursiveArrayIterator
);
384 zend_call_method_with_1_params(&return_value
, spl_ce_RecursiveArrayIterator
, NULL
, "__construct", &retval
, qa
);
386 zval_ptr_dtor(&retval
);
388 } end_error_handling();
390 } end_error_handling();
393 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_toString
, 0, 0, 0)
395 PHP_METHOD(HttpQueryString
, toString
)
397 if (SUCCESS
!= zend_parse_parameters_none()) {
400 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
403 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_toArray
, 0, 0, 0)
405 PHP_METHOD(HttpQueryString
, toArray
)
407 if (SUCCESS
== zend_parse_parameters_none()) {
408 zval
*zqa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
409 RETURN_ZVAL(zqa
, 1, 0);
414 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_get
, 0, 0, 0)
415 ZEND_ARG_INFO(0, name
)
416 ZEND_ARG_INFO(0, type
)
417 ZEND_ARG_INFO(0, defval
)
418 ZEND_ARG_INFO(0, delete)
420 PHP_METHOD(HttpQueryString
, get
)
422 char *name_str
= NULL
;
426 zval
*ztype
= NULL
, *defval
= NULL
;
428 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|szzb", &name_str
, &name_len
, &ztype
, &defval
, &del
)) {
429 if (name_str
&& name_len
) {
431 if (Z_TYPE_P(ztype
) == IS_LONG
) {
432 type
= Z_LVAL_P(ztype
);
433 } else if(Z_TYPE_P(ztype
) == IS_STRING
) {
434 switch (Z_STRVAL_P(ztype
)[0]) {
436 case 'b': type
= PHP_HTTP_QUERYSTRING_TYPE_BOOL
; break;
440 case 'i': type
= PHP_HTTP_QUERYSTRING_TYPE_INT
; break;
444 case 'f': type
= PHP_HTTP_QUERYSTRING_TYPE_FLOAT
; break;
446 case 's': type
= PHP_HTTP_QUERYSTRING_TYPE_STRING
; break;
448 case 'a': type
= PHP_HTTP_QUERYSTRING_TYPE_ARRAY
; break;
450 case 'o': type
= PHP_HTTP_QUERYSTRING_TYPE_OBJECT
; break;
454 php_http_querystring_get(getThis(), type
, name_str
, name_len
, defval
, del
, return_value TSRMLS_CC
);
456 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
461 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_set
, 0, 0, 1)
462 ZEND_ARG_INFO(0, params
)
464 PHP_METHOD(HttpQueryString
, set
)
468 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", ¶ms
)) {
472 php_http_querystring_set(getThis(), params
, QS_MERGE TSRMLS_CC
);
473 RETVAL_ZVAL(getThis(), 1, 0);
476 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_mod
, 0, 0, 0)
477 ZEND_ARG_INFO(0, params
)
479 PHP_METHOD(HttpQueryString
, mod
)
483 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
484 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", ¶ms
)) {
485 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
486 ZVAL_OBJVAL(return_value
, Z_OBJ_HT_P(getThis())->clone_obj(getThis() TSRMLS_CC
), 0);
487 php_http_querystring_set(return_value
, params
, QS_MERGE TSRMLS_CC
);
488 } end_error_handling();
490 } end_error_handling();
493 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString___getter
, 0, 0, 1)
494 ZEND_ARG_INFO(0, name
)
495 ZEND_ARG_INFO(0, defval
)
496 ZEND_ARG_INFO(0, delete)
498 #define PHP_HTTP_QUERYSTRING_GETTER(method, TYPE) \
499 PHP_METHOD(HttpQueryString, method) \
503 zval *defval = NULL; \
505 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zb", &name, &name_len, &defval, &del)) { \
506 php_http_querystring_get(getThis(), TYPE, name, name_len, defval, del, return_value TSRMLS_CC); \
509 PHP_HTTP_QUERYSTRING_GETTER(getBool
, IS_BOOL
);
510 PHP_HTTP_QUERYSTRING_GETTER(getInt
, IS_LONG
);
511 PHP_HTTP_QUERYSTRING_GETTER(getFloat
, IS_DOUBLE
);
512 PHP_HTTP_QUERYSTRING_GETTER(getString
, IS_STRING
);
513 PHP_HTTP_QUERYSTRING_GETTER(getArray
, IS_ARRAY
);
514 PHP_HTTP_QUERYSTRING_GETTER(getObject
, IS_OBJECT
);
516 #ifdef PHP_HTTP_HAVE_ICONV
517 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_xlate
, 0, 0, 2)
518 ZEND_ARG_INFO(0, from_encoding
)
519 ZEND_ARG_INFO(0, to_encoding
)
521 PHP_METHOD(HttpQueryString
, xlate
)
523 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
527 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &ie
, &ie_len
, &oe
, &oe_len
)) {
528 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
529 zval
*na
, *qa
= php_http_ztyp(IS_ARRAY
, zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
533 if (SUCCESS
== php_http_querystring_xlate(na
, qa
, ie
, oe TSRMLS_CC
)) {
534 php_http_querystring_set(getThis(), na
, 0 TSRMLS_CC
);
540 RETVAL_ZVAL(getThis(), 1, 0);
541 } end_error_handling();
543 } end_error_handling();
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 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
566 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", &serialized
)) {
567 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
568 if (Z_TYPE_P(serialized
) == IS_STRING
) {
569 php_http_querystring_set(getThis(), serialized
, 0 TSRMLS_CC
);
571 php_http_error(HE_WARNING
, PHP_HTTP_E_QUERYSTRING
, "Expected a string as parameter");
573 } end_error_handling();
575 } end_error_handling();
578 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetGet
, 0, 0, 1)
579 ZEND_ARG_INFO(0, offset
)
581 PHP_METHOD(HttpQueryString
, offsetGet
)
587 if ((SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
))) {
588 zval
*qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
590 if (Z_TYPE_P(qa
) == IS_ARRAY
591 && 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
)) {
611 MAKE_STD_ZVAL(param
);
614 add_assoc_zval_ex(param
, offset_str
, offset_len
+ 1, value
);
615 php_http_querystring_set(getThis(), param
, 0 TSRMLS_CC
);
616 zval_ptr_dtor(¶m
);
620 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetExists
, 0, 0, 1)
621 ZEND_ARG_INFO(0, offset
)
623 PHP_METHOD(HttpQueryString
, offsetExists
)
629 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
630 zval
*qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
632 if (Z_TYPE_P(qa
) == IS_ARRAY
633 && SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qa
), offset_str
, offset_len
+ 1, (void *) &value
)
634 && Z_TYPE_PP(value
) != IS_NULL
642 ZEND_BEGIN_ARG_INFO_EX(ai_HttpQueryString_offsetUnset
, 0, 0, 1)
643 ZEND_ARG_INFO(0, offset
)
645 PHP_METHOD(HttpQueryString
, offsetUnset
)
650 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
653 MAKE_STD_ZVAL(param
);
655 add_assoc_null_ex(param
, offset_str
, offset_len
+ 1);
656 php_http_querystring_set(getThis(), param
, QS_MERGE TSRMLS_CC
);
657 zval_ptr_dtor(¶m
);
661 zend_class_entry
*php_http_querystring_class_entry
;
663 static zend_function_entry php_http_querystring_methods
[] = {
664 PHP_ME(HttpQueryString
, __construct
, ai_HttpQueryString___construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
|ZEND_ACC_FINAL
)
666 PHP_ME(HttpQueryString
, toArray
, ai_HttpQueryString_toArray
, ZEND_ACC_PUBLIC
)
667 PHP_ME(HttpQueryString
, toString
, ai_HttpQueryString_toString
, ZEND_ACC_PUBLIC
)
668 ZEND_MALIAS(HttpQueryString
, __toString
, toString
, ai_HttpQueryString_toString
, ZEND_ACC_PUBLIC
)
670 PHP_ME(HttpQueryString
, get
, ai_HttpQueryString_get
, ZEND_ACC_PUBLIC
)
671 PHP_ME(HttpQueryString
, set
, ai_HttpQueryString_set
, ZEND_ACC_PUBLIC
)
672 PHP_ME(HttpQueryString
, mod
, ai_HttpQueryString_mod
, ZEND_ACC_PUBLIC
)
674 PHP_ME(HttpQueryString
, getBool
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
675 PHP_ME(HttpQueryString
, getInt
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
676 PHP_ME(HttpQueryString
, getFloat
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
677 PHP_ME(HttpQueryString
, getString
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
678 PHP_ME(HttpQueryString
, getArray
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
679 PHP_ME(HttpQueryString
, getObject
, ai_HttpQueryString___getter
, ZEND_ACC_PUBLIC
)
681 PHP_ME(HttpQueryString
, getIterator
, ai_HttpQueryString_getIterator
, ZEND_ACC_PUBLIC
)
683 PHP_ME(HttpQueryString
, getGlobalInstance
, ai_HttpQueryString_getGlobalInstance
, ZEND_ACC_PUBLIC
|ZEND_ACC_STATIC
)
684 #ifdef PHP_HTTP_HAVE_ICONV
685 PHP_ME(HttpQueryString
, xlate
, ai_HttpQueryString_xlate
, ZEND_ACC_PUBLIC
)
688 /* Implements Serializable */
689 PHP_ME(HttpQueryString
, serialize
, ai_HttpQueryString_serialize
, ZEND_ACC_PUBLIC
)
690 PHP_ME(HttpQueryString
, unserialize
, ai_HttpQueryString_unserialize
, ZEND_ACC_PUBLIC
)
692 /* Implements ArrayAccess */
693 PHP_ME(HttpQueryString
, offsetGet
, ai_HttpQueryString_offsetGet
, ZEND_ACC_PUBLIC
)
694 PHP_ME(HttpQueryString
, offsetSet
, ai_HttpQueryString_offsetSet
, ZEND_ACC_PUBLIC
)
695 PHP_ME(HttpQueryString
, offsetExists
, ai_HttpQueryString_offsetExists
, ZEND_ACC_PUBLIC
)
696 PHP_ME(HttpQueryString
, offsetUnset
, ai_HttpQueryString_offsetUnset
, ZEND_ACC_PUBLIC
)
701 PHP_MINIT_FUNCTION(http_querystring
)
703 zend_class_entry ce
= {0};
705 INIT_NS_CLASS_ENTRY(ce
, "http", "QueryString", php_http_querystring_methods
);
706 php_http_querystring_class_entry
= zend_register_internal_class_ex(&ce
, php_http_object_class_entry
, NULL TSRMLS_CC
);
707 zend_class_implements(php_http_querystring_class_entry TSRMLS_CC
, 3, zend_ce_serializable
, zend_ce_arrayaccess
, zend_ce_aggregate
);
709 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("instance"), (ZEND_ACC_STATIC
|ZEND_ACC_PRIVATE
) TSRMLS_CC
);
710 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("queryArray"), ZEND_ACC_PRIVATE TSRMLS_CC
);
712 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_BOOL"), PHP_HTTP_QUERYSTRING_TYPE_BOOL TSRMLS_CC
);
713 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_INT"), PHP_HTTP_QUERYSTRING_TYPE_INT TSRMLS_CC
);
714 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_FLOAT"), PHP_HTTP_QUERYSTRING_TYPE_FLOAT TSRMLS_CC
);
715 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_STRING"), PHP_HTTP_QUERYSTRING_TYPE_STRING TSRMLS_CC
);
716 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_ARRAY"), PHP_HTTP_QUERYSTRING_TYPE_ARRAY TSRMLS_CC
);
717 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_OBJECT"), PHP_HTTP_QUERYSTRING_TYPE_OBJECT TSRMLS_CC
);
727 * vim600: noet sw=4 ts=4 fdm=marker
728 * vim<600: noet sw=4 ts=4