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 PHP_HTTP_API
int _http_querystring_xlate(zval
*array
, zval
*param
, const char *ie
, const char *oe TSRMLS_DC
)
39 char *xlate_str
= NULL
, *xkey
, *kstr
= NULL
;
40 size_t xlate_len
= 0, xlen
;
44 FOREACH_KEYLENVAL(pos
, param
, kstr
, klen
, kidx
, entry
) {
46 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(kstr
, klen
-1, &xkey
, &xlen
, oe
, ie
)) {
47 http_error_ex(HE_WARNING
, HTTP_E_QUERYSTRING
, "Failed to convert '%.*s' from '%s' to '%s'", klen
-1, kstr
, ie
, oe
);
52 if (Z_TYPE_PP(entry
) == IS_STRING
) {
53 if (PHP_ICONV_ERR_SUCCESS
!= php_iconv_string(Z_STRVAL_PP(entry
), Z_STRLEN_PP(entry
), &xlate_str
, &xlate_len
, oe
, ie
)) {
57 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
);
61 add_assoc_stringl_ex(array
, xkey
, xlen
+1, xlate_str
, xlate_len
, 0);
63 add_index_stringl(array
, kidx
, xlate_str
, xlate_len
, 0);
65 } else if (Z_TYPE_PP(entry
) == IS_ARRAY
) {
68 MAKE_STD_ZVAL(subarray
);
71 add_assoc_zval_ex(array
, xkey
, xlen
+1, subarray
);
73 add_index_zval(array
, kidx
, subarray
);
75 if (SUCCESS
!= http_querystring_xlate(subarray
, *entry
, ie
, oe
)) {
90 #endif /* HAVE_ICONV */
92 PHP_HTTP_API
void _http_querystring_update(zval
*qarray
, zval
*qstring TSRMLS_DC
)
97 if (Z_TYPE_P(qarray
) != IS_ARRAY
) {
98 convert_to_array(qarray
);
100 if (SUCCESS
== http_urlencode_hash_ex(Z_ARRVAL_P(qarray
), 0, NULL
, 0, &s
, &l
)) {
102 ZVAL_STRINGL(qstring
, s
, l
, 0);
104 http_error(HE_WARNING
, HTTP_E_QUERYSTRING
, "Failed to update query string");
108 PHP_HTTP_API
int _http_querystring_modify_array_ex(zval
*qarray
, int key_type
, char *key
, int keylen
, ulong idx
, zval
*params_entry TSRMLS_DC
)
113 if (Z_TYPE_P(params_entry
) == IS_NULL
) {
114 if (key_type
== HASH_KEY_IS_STRING
) {
115 return (SUCCESS
== zend_hash_del(Z_ARRVAL_P(qarray
), key
, keylen
));
117 return (SUCCESS
== zend_hash_index_del(Z_ARRVAL_P(qarray
), idx
));
122 if ( ((key_type
== HASH_KEY_IS_STRING
) && (SUCCESS
== zend_hash_find(Z_ARRVAL_P(qarray
), key
, keylen
, (void *) &qarray_entry
))) ||
123 ((key_type
== HASH_KEY_IS_LONG
) && (SUCCESS
== zend_hash_index_find(Z_ARRVAL_P(qarray
), idx
, (void *) &qarray_entry
)))) {
127 if (Z_TYPE_P(params_entry
) == IS_ARRAY
) {
128 return http_querystring_modify_array(*qarray_entry
, params_entry
);
131 if ((SUCCESS
== is_equal_function(&equal
, *qarray_entry
, params_entry TSRMLS_CC
)) && Z_BVAL(equal
)) {
137 ZVAL_ADDREF(params_entry
);
138 if (key_type
== HASH_KEY_IS_STRING
) {
139 add_assoc_zval_ex(qarray
, key
, keylen
, params_entry
);
141 add_index_zval(qarray
, idx
, params_entry
);
146 PHP_HTTP_API
int _http_querystring_modify_array(zval
*qarray
, zval
*params TSRMLS_DC
)
153 zval
**params_entry
= NULL
;
155 FOREACH_KEYLENVAL(pos
, params
, key
, keylen
, idx
, params_entry
) {
156 if (http_querystring_modify_array_ex(qarray
, key
? HASH_KEY_IS_STRING
: HASH_KEY_IS_LONG
, key
, keylen
, idx
, *params_entry
)) {
165 PHP_HTTP_API
int _http_querystring_modify(zval
*qarray
, zval
*params TSRMLS_DC
)
167 if (Z_TYPE_P(params
) == IS_ARRAY
) {
168 return http_querystring_modify_array(qarray
, params
);
169 } else if (Z_TYPE_P(params
) == IS_OBJECT
) {
171 if (!instanceof_function(Z_OBJCE_P(params
), http_querystring_object_ce TSRMLS_CC
)) {
174 INIT_ZARR(temp_array
, HASH_OF(params
));
175 return http_querystring_modify_array(qarray
, &temp_array
);
178 return http_querystring_modify_array(qarray
, GET_PROP_EX(params
, queryArray
));
188 convert_to_string_ex(¶ms
);
189 sapi_module
.treat_data(PARSE_STRING
, estrdup(Z_STRVAL_P(params
)), &array TSRMLS_CC
);
190 zval_ptr_dtor(¶ms
);
191 rv
= http_querystring_modify_array(qarray
, &array
);
202 * vim600: noet sw=4 ts=4 fdm=marker
203 * vim<600: noet sw=4 ts=4