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-2006, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
15 #define HTTP_WANT_SAPI
18 #include "php_variables.h"
21 # include "ext/iconv/php_iconv.h"
22 # include "ext/standard/url.h"
25 #include "php_http_api.h"
26 #include "php_http_url_api.h"
27 #include "php_http_querystring_api.h"
30 #define OBJ_PROP_CE http_querystring_object_ce
31 extern zend_class_entry
*http_querystring_object_ce
;
35 #define http_querystring_modify_array_ex(q, t, k, kl, i, pe) _http_querystring_modify_array_ex((q), (t), (k), (kl), (i), (pe) TSRMLS_CC)
36 static inline int _http_querystring_modify_array_ex(zval
*qarray
, int key_type
, char *key
, int keylen
, ulong idx
, zval
*params_entry TSRMLS_DC
);
37 #define http_querystring_modify_array(q, p) _http_querystring_modify_array((q), (p) TSRMLS_CC)
38 static inline int _http_querystring_modify_array(zval
*qarray
, zval
*params TSRMLS_DC
);
42 PHP_HTTP_API
int _http_querystring_xlate(zval
*array
, zval
*param
, const char *ie
, const char *oe TSRMLS_DC
)
46 char *xlate_str
= NULL
, *xkey
, *kstr
= NULL
;
47 size_t xlate_len
= 0, xlen
;
51 FOREACH_KEYLENVAL(pos
, param
, kstr
, klen
, kidx
, entry
) {
53 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(kstr
, klen
-1, &xkey
, &xlen
, oe
, ie
)) {
54 http_error_ex(HE_WARNING
, HTTP_E_QUERYSTRING
, "Failed to convert '%.*s' from '%s' to '%s'", klen
-1, kstr
, ie
, oe
);
59 if (Z_TYPE_PP(entry
) == IS_STRING
) {
60 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(Z_STRVAL_PP(entry
), Z_STRLEN_PP(entry
), &xlate_str
, &xlate_len
, oe
, ie
)) {
64 http_error_ex(HE_WARNING
, HTTP_E_QUERYSTRING
, "Failed to convert '%.*s' from '%s' to '%s'", Z_STRLEN_PP(entry
), Z_STRVAL_PP(entry
), ie
, oe
);
68 add_assoc_stringl_ex(array
, xkey
, xlen
+1, xlate_str
, xlate_len
, 0);
70 add_index_stringl(array
, kidx
, xlate_str
, xlate_len
, 0);
72 } else if (Z_TYPE_PP(entry
) == IS_ARRAY
) {
75 MAKE_STD_ZVAL(subarray
);
78 add_assoc_zval_ex(array
, xkey
, xlen
+1, subarray
);
80 add_index_zval(array
, kidx
, subarray
);
82 if (SUCCESS
!= http_querystring_xlate(subarray
, *entry
, ie
, oe
)) {
97 #endif /* HAVE_ICONV */
99 PHP_HTTP_API
void _http_querystring_update(zval
*qarray
, zval
*qstring TSRMLS_DC
)
104 if (Z_TYPE_P(qarray
) != IS_ARRAY
) {
105 convert_to_array(qarray
);
107 if (SUCCESS
== http_urlencode_hash_ex(Z_ARRVAL_P(qarray
), 0, NULL
, 0, &s
, &l
)) {
109 ZVAL_STRINGL(qstring
, s
, l
, 0);
111 http_error(HE_WARNING
, HTTP_E_QUERYSTRING
, "Failed to update query string");
115 PHP_HTTP_API
int _http_querystring_modify(zval
*qarray
, zval
*params TSRMLS_DC
)
117 if (Z_TYPE_P(params
) == IS_ARRAY
) {
118 return http_querystring_modify_array(qarray
, params
);
119 } else if (Z_TYPE_P(params
) == IS_OBJECT
) {
121 if (!instanceof_function(Z_OBJCE_P(params
), http_querystring_object_ce TSRMLS_CC
)) {
124 INIT_ZARR(temp_array
, HASH_OF(params
));
125 return http_querystring_modify_array(qarray
, &temp_array
);
128 return http_querystring_modify_array(qarray
, GET_PROP_EX(params
, queryArray
));
138 convert_to_string_ex(¶ms
);
139 sapi_module
.treat_data(PARSE_STRING
, estrdup(Z_STRVAL_P(params
)), &array TSRMLS_CC
);
140 zval_ptr_dtor(¶ms
);
141 rv
= http_querystring_modify_array(qarray
, &array
);
147 static inline int _http_querystring_modify_array(zval
*qarray
, zval
*params TSRMLS_DC
)
154 zval
**params_entry
= NULL
;
156 FOREACH_KEYLENVAL(pos
, params
, key
, keylen
, idx
, params_entry
) {
157 if (http_querystring_modify_array_ex(qarray
, key
? HASH_KEY_IS_STRING
: HASH_KEY_IS_LONG
, key
, keylen
, idx
, *params_entry
)) {
166 static inline int _http_querystring_modify_array_ex(zval
*qarray
, int key_type
, char *key
, int keylen
, ulong idx
, zval
*params_entry TSRMLS_DC
)
171 if (Z_TYPE_P(params_entry
) == IS_NULL
) {
172 if (key_type
== HASH_KEY_IS_STRING
) {
173 return (SUCCESS
== zend_hash_del(Z_ARRVAL_P(qarray
), key
, keylen
));
175 return (SUCCESS
== zend_hash_index_del(Z_ARRVAL_P(qarray
), idx
));
180 if ( ((key_type
== HASH_KEY_IS_STRING
) && (SUCCESS
== zend_hash_find(Z_ARRVAL_P(qarray
), key
, keylen
, (void *) &qarray_entry
))) ||
181 ((key_type
== HASH_KEY_IS_LONG
) && (SUCCESS
== zend_hash_index_find(Z_ARRVAL_P(qarray
), idx
, (void *) &qarray_entry
)))) {
185 if (Z_TYPE_P(params_entry
) == IS_ARRAY
) {
186 return http_querystring_modify_array(*qarray_entry
, params_entry
);
189 if ((SUCCESS
== is_equal_function(&equal
, *qarray_entry
, params_entry TSRMLS_CC
)) && Z_BVAL(equal
)) {
195 ZVAL_ADDREF(params_entry
);
196 if (key_type
== HASH_KEY_IS_STRING
) {
197 add_assoc_zval_ex(qarray
, key
, keylen
, params_entry
);
199 add_index_zval(qarray
, idx
, params_entry
);
209 * vim600: noet sw=4 ts=4 fdm=marker
210 * vim<600: noet sw=4 ts=4