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-2011, 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>
26 static inline void php_http_querystring_set(zval
*instance
, zval
*params
, int flags TSRMLS_DC
)
30 if (flags
& QS_MERGE
) {
31 qa
= php_http_zsep(1, IS_ARRAY
, zend_read_property(php_http_querystring_get_class_entry(), instance
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
37 php_http_querystring_update(qa
, params
, NULL TSRMLS_CC
);
38 zend_update_property(php_http_querystring_get_class_entry(), instance
, ZEND_STRL("queryArray"), qa TSRMLS_CC
);
42 static inline void php_http_querystring_str(zval
*instance
, zval
*return_value TSRMLS_DC
)
44 zval
*qa
= zend_read_property(php_http_querystring_get_class_entry(), instance
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
46 if (Z_TYPE_P(qa
) == IS_ARRAY
) {
47 php_http_querystring_update(qa
, NULL
, return_value TSRMLS_CC
);
49 RETURN_EMPTY_STRING();
53 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
)
55 zval
**arrval
, *qarray
= zend_read_property(php_http_querystring_get_class_entry(), getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
57 if ((Z_TYPE_P(qarray
) == IS_ARRAY
) && (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qarray
), name
, name_len
+ 1, (void *) &arrval
))) {
59 zval
*value
= php_http_ztyp(type
, *arrval
);
60 RETVAL_ZVAL(value
, 1, 1);
62 RETVAL_ZVAL(*arrval
, 1, 0);
68 MAKE_STD_ZVAL(delarr
);
70 add_assoc_null_ex(delarr
, name
, name_len
+ 1);
71 php_http_querystring_set(this_ptr
, delarr
, QS_MERGE TSRMLS_CC
);
72 zval_ptr_dtor(&delarr
);
75 RETURN_ZVAL(defval
, 1, 0);
79 #ifdef PHP_HTTP_HAVE_ICONV
80 PHP_HTTP_API STATUS
php_http_querystring_xlate(zval
*dst
, zval
*src
, const char *ie
, const char *oe TSRMLS_DC
)
84 char *xlate_str
= NULL
, *xkey
;
85 size_t xlate_len
= 0, xlen
;
86 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
88 FOREACH_KEYVAL(pos
, src
, key
, entry
) {
89 if (key
.type
== HASH_KEY_IS_STRING
) {
90 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(key
.str
, key
.len
-1, &xkey
, &xlen
, oe
, ie
)) {
91 php_http_error(HE_WARNING
, PHP_HTTP_E_QUERYSTRING
, "Failed to convert '%.*s' from '%s' to '%s'", key
.len
-1, key
.str
, ie
, oe
);
96 if (Z_TYPE_PP(entry
) == IS_STRING
) {
97 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(Z_STRVAL_PP(entry
), Z_STRLEN_PP(entry
), &xlate_str
, &xlate_len
, oe
, ie
)) {
98 if (key
.type
== HASH_KEY_IS_STRING
) {
101 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
);
104 if (key
.type
== HASH_KEY_IS_STRING
) {
105 add_assoc_stringl_ex(dst
, xkey
, xlen
+1, xlate_str
, xlate_len
, 0);
107 add_index_stringl(dst
, key
.num
, xlate_str
, xlate_len
, 0);
109 } else if (Z_TYPE_PP(entry
) == IS_ARRAY
) {
112 MAKE_STD_ZVAL(subarray
);
113 array_init(subarray
);
114 if (key
.type
== HASH_KEY_IS_STRING
) {
115 add_assoc_zval_ex(dst
, xkey
, xlen
+1, subarray
);
117 add_index_zval(dst
, key
.num
, subarray
);
119 if (SUCCESS
!= php_http_querystring_xlate(subarray
, *entry
, ie
, oe TSRMLS_CC
)) {
120 if (key
.type
== HASH_KEY_IS_STRING
) {
127 if (key
.type
== HASH_KEY_IS_STRING
) {
133 #endif /* HAVE_ICONV */
135 PHP_HTTP_API STATUS
php_http_querystring_ctor(zval
*instance
, zval
*params TSRMLS_DC
)
137 php_http_querystring_set(instance
, params
, 0 TSRMLS_CC
);
141 static int apply_querystring(void *pData TSRMLS_DC
)
145 if (Z_TYPE_PP(val
) == IS_ARRAY
) {
148 if (SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("value"), (void *) &zvalue
)) {
154 Z_TYPE_P(tmp
) = IS_NULL
;
159 return ZEND_HASH_APPLY_KEEP
;
162 PHP_HTTP_API STATUS
php_http_querystring_parse(HashTable
*ht
, const char *str
, size_t len TSRMLS_DC
)
165 php_http_params_opts_t opts
;
166 php_http_params_token_t psep
= { ZEND_STRL("&") }, *psepp
[] = { &psep
, NULL
};
167 php_http_params_token_t vsep
= { ZEND_STRL("=") }, *vsepp
[] = { &vsep
, NULL
};
168 const char *asi_str
= NULL
;
171 opts
.input
.str
= estrndup(str
, len
);
172 opts
.input
.len
= len
;
176 opts
.flags
= PHP_HTTP_PARAMS_QUERY
;
178 if (SUCCESS
== php_http_ini_entry(ZEND_STRL("arg_separator.input"), &asi_str
, &asi_len
, 0 TSRMLS_CC
) && asi_len
) {
182 array_init_size(arr
, asi_len
);
185 add_next_index_stringl(arr
, asi_str
++, 1, 1);
188 opts
.param
= php_http_params_separator_init(arr TSRMLS_CC
);
193 MAKE_STD_ZVAL(opts
.defval
);
194 ZVAL_NULL(opts
.defval
);
196 if (php_http_params_parse(ht
, &opts TSRMLS_CC
)) {
197 zend_hash_apply(ht
, apply_querystring TSRMLS_CC
);
202 php_http_params_separator_free(opts
.param
);
205 zval_ptr_dtor(&opts
.defval
);
206 efree(opts
.input
.str
);
210 PHP_HTTP_API STATUS
php_http_querystring_update(zval
*qarray
, zval
*params
, zval
*outstring TSRMLS_DC
)
212 /* enforce proper type */
213 if (Z_TYPE_P(qarray
) != IS_ARRAY
) {
214 convert_to_array(qarray
);
221 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
222 zval
**params_entry
, **qarray_entry
;
223 zval zv
, *zv_ptr
= NULL
;
228 /* squeeze the hash out of the zval */
229 if (Z_TYPE_P(params
) == IS_OBJECT
&& instanceof_function(Z_OBJCE_P(params
), php_http_querystring_get_class_entry() TSRMLS_CC
)) {
230 zv_ptr
= php_http_ztyp(IS_ARRAY
, zend_read_property(php_http_querystring_get_class_entry(), params
, ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
231 ptr
= Z_ARRVAL_P(zv_ptr
);
232 } else if (Z_TYPE_P(params
) == IS_OBJECT
|| Z_TYPE_P(params
) == IS_ARRAY
) {
233 ptr
= HASH_OF(params
);
235 zv_ptr
= php_http_ztyp(IS_STRING
, params
);
237 php_http_querystring_parse(Z_ARRVAL(zv
), Z_STRVAL_P(zv_ptr
), Z_STRLEN_P(zv_ptr
) TSRMLS_CC
);
238 zval_ptr_dtor(&zv_ptr
);
243 FOREACH_HASH_KEYVAL(pos
, ptr
, key
, params_entry
) {
244 /* only public properties */
245 if (key
.type
!= HASH_KEY_IS_STRING
|| *key
.str
) {
246 if (Z_TYPE_PP(params_entry
) == IS_NULL
) {
250 if (key
.type
== HASH_KEY_IS_STRING
) {
251 zend_hash_del(Z_ARRVAL_P(qarray
), key
.str
, key
.len
);
253 zend_hash_index_del(Z_ARRVAL_P(qarray
), key
.num
);
255 } else if ( ((key
.type
== HASH_KEY_IS_STRING
) && (SUCCESS
== zend_hash_find(Z_ARRVAL_P(qarray
), key
.str
, key
.len
, (void *) &qarray_entry
)))
256 || ((key
.type
== HASH_KEY_IS_LONG
) && (SUCCESS
== zend_hash_index_find(Z_ARRVAL_P(qarray
), key
.num
, (void *) &qarray_entry
)))) {
260 zval equal
, *entry
= NULL
;
263 if (Z_TYPE_PP(params_entry
) == IS_ARRAY
|| Z_TYPE_PP(params_entry
) == IS_OBJECT
) {
264 entry
= php_http_zsep(1, IS_ARRAY
, *qarray_entry
);
265 php_http_querystring_update(entry
, *params_entry
, NULL TSRMLS_CC
);
266 } else if ((FAILURE
== is_equal_function(&equal
, *qarray_entry
, *params_entry TSRMLS_CC
)) || !Z_BVAL(equal
)) {
267 Z_ADDREF_PP(params_entry
);
268 entry
= *params_entry
;
272 if (key
.type
== HASH_KEY_IS_STRING
) {
273 zend_hash_update(Z_ARRVAL_P(qarray
), key
.str
, key
.len
, (void *) &entry
, sizeof(zval
*), NULL
);
275 zend_hash_index_update(Z_ARRVAL_P(qarray
), key
.num
, (void *) &entry
, sizeof(zval
*), NULL
);
283 if (Z_TYPE_PP(params_entry
) == IS_OBJECT
) {
284 MAKE_STD_ZVAL(entry
);
286 php_http_querystring_update(entry
, *params_entry
, NULL TSRMLS_CC
);
288 Z_ADDREF_PP(params_entry
);
289 entry
= *params_entry
;
291 if (key
.type
== HASH_KEY_IS_STRING
) {
292 add_assoc_zval_ex(qarray
, key
.str
, key
.len
, entry
);
294 add_index_zval(qarray
, key
.num
, entry
);
301 zval_ptr_dtor(&zv_ptr
);
306 /* serialize to string */
311 if (SUCCESS
== php_http_url_encode_hash(Z_ARRVAL_P(qarray
), NULL
, 0, &s
, &l TSRMLS_CC
)) {
312 zval_dtor(outstring
);
313 ZVAL_STRINGL(outstring
, s
, l
, 0);
315 php_http_error(HE_WARNING
, PHP_HTTP_E_QUERYSTRING
, "Failed to encode query string");
323 #define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpQueryString, method, 0, req_args)
324 #define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpQueryString, method, 0)
325 #define PHP_HTTP_QUERYSTRING_ME(method, visibility) PHP_ME(HttpQueryString, method, PHP_HTTP_ARGS(HttpQueryString, method), visibility)
326 #define PHP_HTTP_QUERYSTRING_GME(method, visibility) PHP_ME(HttpQueryString, method, PHP_HTTP_ARGS(HttpQueryString, __getter), visibility)
328 PHP_HTTP_BEGIN_ARGS(__construct
, 0)
329 PHP_HTTP_ARG_VAL(params
, 0)
332 PHP_HTTP_EMPTY_ARGS(getGlobalInstance
);
334 PHP_HTTP_EMPTY_ARGS(toArray
);
335 PHP_HTTP_EMPTY_ARGS(toString
);
337 PHP_HTTP_BEGIN_ARGS(get
, 0)
338 PHP_HTTP_ARG_VAL(name
, 0)
339 PHP_HTTP_ARG_VAL(type
, 0)
340 PHP_HTTP_ARG_VAL(defval
, 0)
341 PHP_HTTP_ARG_VAL(delete, 0)
344 PHP_HTTP_BEGIN_ARGS(set
, 1)
345 PHP_HTTP_ARG_VAL(params
, 0)
348 PHP_HTTP_BEGIN_ARGS(mod
, 0)
349 PHP_HTTP_ARG_VAL(params
, 0)
352 PHP_HTTP_BEGIN_ARGS(__getter
, 1)
353 PHP_HTTP_ARG_VAL(name
, 0)
354 PHP_HTTP_ARG_VAL(defval
, 0)
355 PHP_HTTP_ARG_VAL(delete, 0)
358 #ifdef PHP_HTTP_HAVE_ICONV
359 PHP_HTTP_BEGIN_ARGS(xlate
, 2)
360 PHP_HTTP_ARG_VAL(from_encoding
, 0)
361 PHP_HTTP_ARG_VAL(to_encoding
, 0)
365 PHP_HTTP_EMPTY_ARGS(serialize
);
366 PHP_HTTP_BEGIN_ARGS(unserialize
, 1)
367 PHP_HTTP_ARG_VAL(serialized
, 0)
370 PHP_HTTP_BEGIN_ARGS(offsetGet
, 1)
371 PHP_HTTP_ARG_VAL(offset
, 0)
374 PHP_HTTP_BEGIN_ARGS(offsetSet
, 2)
375 PHP_HTTP_ARG_VAL(offset
, 0)
376 PHP_HTTP_ARG_VAL(value
, 0)
379 PHP_HTTP_BEGIN_ARGS(offsetExists
, 1)
380 PHP_HTTP_ARG_VAL(offset
, 0)
383 PHP_HTTP_BEGIN_ARGS(offsetUnset
, 1)
384 PHP_HTTP_ARG_VAL(offset
, 0)
387 PHP_HTTP_EMPTY_ARGS(getIterator
);
389 static zend_class_entry
*php_http_querystring_class_entry
;
391 zend_class_entry
*php_http_querystring_get_class_entry(void)
393 return php_http_querystring_class_entry
;
396 static zend_function_entry php_http_querystring_method_entry
[] = {
397 PHP_HTTP_QUERYSTRING_ME(__construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
|ZEND_ACC_FINAL
)
399 PHP_HTTP_QUERYSTRING_ME(toArray
, ZEND_ACC_PUBLIC
)
400 PHP_HTTP_QUERYSTRING_ME(toString
, ZEND_ACC_PUBLIC
)
401 ZEND_MALIAS(HttpQueryString
, __toString
, toString
, PHP_HTTP_ARGS(HttpQueryString
, toString
), ZEND_ACC_PUBLIC
)
403 PHP_HTTP_QUERYSTRING_ME(get
, ZEND_ACC_PUBLIC
)
404 PHP_HTTP_QUERYSTRING_ME(set
, ZEND_ACC_PUBLIC
)
405 PHP_HTTP_QUERYSTRING_ME(mod
, ZEND_ACC_PUBLIC
)
407 PHP_HTTP_QUERYSTRING_GME(getBool
, ZEND_ACC_PUBLIC
)
408 PHP_HTTP_QUERYSTRING_GME(getInt
, ZEND_ACC_PUBLIC
)
409 PHP_HTTP_QUERYSTRING_GME(getFloat
, ZEND_ACC_PUBLIC
)
410 PHP_HTTP_QUERYSTRING_GME(getString
, ZEND_ACC_PUBLIC
)
411 PHP_HTTP_QUERYSTRING_GME(getArray
, ZEND_ACC_PUBLIC
)
412 PHP_HTTP_QUERYSTRING_GME(getObject
, ZEND_ACC_PUBLIC
)
414 PHP_HTTP_QUERYSTRING_ME(getIterator
, ZEND_ACC_PUBLIC
)
416 PHP_HTTP_QUERYSTRING_ME(getGlobalInstance
, ZEND_ACC_PUBLIC
|ZEND_ACC_STATIC
)
417 #ifdef PHP_HTTP_HAVE_ICONV
418 PHP_HTTP_QUERYSTRING_ME(xlate
, ZEND_ACC_PUBLIC
)
421 /* Implements Serializable */
422 PHP_HTTP_QUERYSTRING_ME(serialize
, ZEND_ACC_PUBLIC
)
423 PHP_HTTP_QUERYSTRING_ME(unserialize
, ZEND_ACC_PUBLIC
)
425 /* Implements ArrayAccess */
426 PHP_HTTP_QUERYSTRING_ME(offsetGet
, ZEND_ACC_PUBLIC
)
427 PHP_HTTP_QUERYSTRING_ME(offsetSet
, ZEND_ACC_PUBLIC
)
428 PHP_HTTP_QUERYSTRING_ME(offsetExists
, ZEND_ACC_PUBLIC
)
429 PHP_HTTP_QUERYSTRING_ME(offsetUnset
, ZEND_ACC_PUBLIC
)
434 PHP_MINIT_FUNCTION(http_querystring
)
436 PHP_HTTP_REGISTER_CLASS(http
, QueryString
, http_querystring
, php_http_object_get_class_entry(), 0);
438 zend_class_implements(php_http_querystring_class_entry TSRMLS_CC
, 3, zend_ce_serializable
, zend_ce_arrayaccess
, zend_ce_aggregate
);
440 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("instance"), (ZEND_ACC_STATIC
|ZEND_ACC_PRIVATE
) TSRMLS_CC
);
441 zend_declare_property_null(php_http_querystring_class_entry
, ZEND_STRL("queryArray"), ZEND_ACC_PRIVATE TSRMLS_CC
);
443 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_BOOL"), PHP_HTTP_QUERYSTRING_TYPE_BOOL TSRMLS_CC
);
444 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_INT"), PHP_HTTP_QUERYSTRING_TYPE_INT TSRMLS_CC
);
445 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_FLOAT"), PHP_HTTP_QUERYSTRING_TYPE_FLOAT TSRMLS_CC
);
446 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_STRING"), PHP_HTTP_QUERYSTRING_TYPE_STRING TSRMLS_CC
);
447 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_ARRAY"), PHP_HTTP_QUERYSTRING_TYPE_ARRAY TSRMLS_CC
);
448 zend_declare_class_constant_long(php_http_querystring_class_entry
, ZEND_STRL("TYPE_OBJECT"), PHP_HTTP_QUERYSTRING_TYPE_OBJECT TSRMLS_CC
);
453 PHP_METHOD(HttpQueryString
, __construct
)
457 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
458 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z", ¶ms
)) {
459 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
460 php_http_querystring_set(getThis(), params
, 0 TSRMLS_CC
);
461 } end_error_handling();
463 } end_error_handling();
466 PHP_METHOD(HttpQueryString
, getGlobalInstance
)
468 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
469 if (SUCCESS
== zend_parse_parameters_none()) {
470 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
471 zval
*instance
= *zend_std_get_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), 0 PHP_HTTP_ZEND_LITERAL_CCN TSRMLS_CC
);
473 if (Z_TYPE_P(instance
) != IS_OBJECT
) {
476 zend_is_auto_global("_GET", lenof("_GET") TSRMLS_CC
);
478 if ((SUCCESS
== zend_hash_find(&EG(symbol_table
), "_GET", sizeof("_GET"), (void *) &_GET
))
479 && (Z_TYPE_PP(_GET
) == IS_ARRAY
)
481 MAKE_STD_ZVAL(instance
);
482 ZVAL_OBJVAL(instance
, php_http_querystring_object_new(php_http_querystring_class_entry TSRMLS_CC
), 0);
484 SEPARATE_ZVAL_TO_MAKE_IS_REF(_GET
);
485 convert_to_array(*_GET
);
486 zend_update_property(php_http_querystring_class_entry
, instance
, ZEND_STRL("queryArray"), *_GET TSRMLS_CC
);
488 zend_update_static_property(php_http_querystring_class_entry
, ZEND_STRL("instance"), instance TSRMLS_CC
);
489 zval_ptr_dtor(&instance
);
491 php_http_error(HE_WARNING
, PHP_HTTP_E_QUERYSTRING
, "Could not acquire reference to superglobal GET array");
494 RETVAL_ZVAL(instance
, 1, 0);
495 } end_error_handling();
497 } end_error_handling();
500 PHP_METHOD(HttpQueryString
, getIterator
)
502 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
503 if (SUCCESS
== zend_parse_parameters_none()) {
504 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
505 zval
*retval
= NULL
, *qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
507 object_init_ex(return_value
, spl_ce_RecursiveArrayIterator
);
508 zend_call_method_with_1_params(&return_value
, spl_ce_RecursiveArrayIterator
, NULL
, "__construct", &retval
, qa
);
510 zval_ptr_dtor(&retval
);
512 } end_error_handling();
514 } end_error_handling();
517 PHP_METHOD(HttpQueryString
, toString
)
519 if (SUCCESS
!= zend_parse_parameters_none()) {
522 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
525 PHP_METHOD(HttpQueryString
, toArray
)
527 if (SUCCESS
== zend_parse_parameters_none()) {
528 RETURN_PROP(php_http_querystring_class_entry
, "queryArray");
533 PHP_METHOD(HttpQueryString
, get
)
535 char *name_str
= NULL
;
539 zval
*ztype
= NULL
, *defval
= NULL
;
541 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|szzb", &name_str
, &name_len
, &ztype
, &defval
, &del
)) {
542 if (name_str
&& name_len
) {
544 if (Z_TYPE_P(ztype
) == IS_LONG
) {
545 type
= Z_LVAL_P(ztype
);
546 } else if(Z_TYPE_P(ztype
) == IS_STRING
) {
547 switch (Z_STRVAL_P(ztype
)[0]) {
549 case 'b': type
= PHP_HTTP_QUERYSTRING_TYPE_BOOL
; break;
553 case 'i': type
= PHP_HTTP_QUERYSTRING_TYPE_INT
; break;
557 case 'f': type
= PHP_HTTP_QUERYSTRING_TYPE_FLOAT
; break;
559 case 's': type
= PHP_HTTP_QUERYSTRING_TYPE_STRING
; break;
561 case 'a': type
= PHP_HTTP_QUERYSTRING_TYPE_ARRAY
; break;
563 case 'o': type
= PHP_HTTP_QUERYSTRING_TYPE_OBJECT
; break;
567 php_http_querystring_get(getThis(), type
, name_str
, name_len
, defval
, del
, return_value TSRMLS_CC
);
569 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
574 PHP_METHOD(HttpQueryString
, set
)
578 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", ¶ms
)) {
582 php_http_querystring_set(getThis(), params
, QS_MERGE TSRMLS_CC
);
583 RETVAL_ZVAL(getThis(), 1, 0);
586 PHP_METHOD(HttpQueryString
, mod
)
590 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
591 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", ¶ms
)) {
592 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
593 ZVAL_OBJVAL(return_value
, Z_OBJ_HT_P(getThis())->clone_obj(getThis() TSRMLS_CC
), 0);
594 php_http_querystring_set(return_value
, params
, QS_MERGE TSRMLS_CC
);
595 } end_error_handling();
597 } end_error_handling();
600 #define PHP_HTTP_QUERYSTRING_GETTER(method, TYPE) \
601 PHP_METHOD(HttpQueryString, method) \
605 zval *defval = NULL; \
607 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zb", &name, &name_len, &defval, &del)) { \
608 php_http_querystring_get(getThis(), TYPE, name, name_len, defval, del, return_value TSRMLS_CC); \
611 PHP_HTTP_QUERYSTRING_GETTER(getBool
, IS_BOOL
);
612 PHP_HTTP_QUERYSTRING_GETTER(getInt
, IS_LONG
);
613 PHP_HTTP_QUERYSTRING_GETTER(getFloat
, IS_DOUBLE
);
614 PHP_HTTP_QUERYSTRING_GETTER(getString
, IS_STRING
);
615 PHP_HTTP_QUERYSTRING_GETTER(getArray
, IS_ARRAY
);
616 PHP_HTTP_QUERYSTRING_GETTER(getObject
, IS_OBJECT
);
618 #ifdef PHP_HTTP_HAVE_ICONV
619 PHP_METHOD(HttpQueryString
, xlate
)
621 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
625 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &ie
, &ie_len
, &oe
, &oe_len
)) {
626 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
627 zval
*na
, *qa
= php_http_ztyp(IS_ARRAY
, zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
));
631 if (SUCCESS
== php_http_querystring_xlate(na
, qa
, ie
, oe TSRMLS_CC
)) {
632 php_http_querystring_set(getThis(), na
, 0 TSRMLS_CC
);
638 RETVAL_ZVAL(getThis(), 1, 0);
639 } end_error_handling();
641 } end_error_handling();
644 #endif /* HAVE_ICONV */
646 PHP_METHOD(HttpQueryString
, serialize
)
648 if (SUCCESS
!= zend_parse_parameters_none()) {
651 php_http_querystring_str(getThis(), return_value TSRMLS_CC
);
654 PHP_METHOD(HttpQueryString
, unserialize
)
658 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
659 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", &serialized
)) {
660 with_error_handling(EH_THROW
, php_http_exception_get_class_entry()) {
661 if (Z_TYPE_P(serialized
) == IS_STRING
) {
662 php_http_querystring_set(getThis(), serialized
, 0 TSRMLS_CC
);
664 php_http_error(HE_WARNING
, PHP_HTTP_E_QUERYSTRING
, "Expected a string as parameter");
666 } end_error_handling();
668 } end_error_handling();
671 PHP_METHOD(HttpQueryString
, offsetGet
)
677 if ((SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
))) {
678 zval
*qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
680 if (Z_TYPE_P(qa
) == IS_ARRAY
681 && SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qa
), offset_str
, offset_len
+ 1, (void *) &value
)
683 RETVAL_ZVAL(*value
, 1, 0);
688 PHP_METHOD(HttpQueryString
, offsetSet
)
694 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sz", &offset_str
, &offset_len
, &value
)) {
697 MAKE_STD_ZVAL(param
);
700 add_assoc_zval_ex(param
, offset_str
, offset_len
+ 1, value
);
701 php_http_querystring_set(getThis(), param
, 0 TSRMLS_CC
);
702 zval_ptr_dtor(¶m
);
706 PHP_METHOD(HttpQueryString
, offsetExists
)
712 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
713 zval
*qa
= zend_read_property(php_http_querystring_class_entry
, getThis(), ZEND_STRL("queryArray"), 0 TSRMLS_CC
);
715 if (Z_TYPE_P(qa
) == IS_ARRAY
716 && SUCCESS
== zend_symtable_find(Z_ARRVAL_P(qa
), offset_str
, offset_len
+ 1, (void *) &value
)
717 && Z_TYPE_PP(value
) != IS_NULL
725 PHP_METHOD(HttpQueryString
, offsetUnset
)
730 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &offset_str
, &offset_len
)) {
733 MAKE_STD_ZVAL(param
);
735 add_assoc_null_ex(param
, offset_str
, offset_len
+ 1);
736 php_http_querystring_set(getThis(), param
, QS_MERGE TSRMLS_CC
);
737 zval_ptr_dtor(¶m
);
747 * vim600: noet sw=4 ts=4 fdm=marker
748 * vim<600: noet sw=4 ts=4