@@ -29,7 +29,7 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
29
29
const char * num_prefix , int num_prefix_len ,
30
30
const char * key_prefix , int key_prefix_len ,
31
31
const char * key_suffix , int key_suffix_len ,
32
- zval * type , char * arg_sep TSRMLS_DC )
32
+ zval * type , char * arg_sep , int enc_type TSRMLS_DC )
33
33
{
34
34
char * key = NULL , * ekey , * newprefix , * p ;
35
35
int arg_sep_len , key_len , ekey_len , key_type , newprefix_len ;
@@ -81,7 +81,11 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
81
81
}
82
82
if (Z_TYPE_PP (zdata ) == IS_ARRAY || Z_TYPE_PP (zdata ) == IS_OBJECT ) {
83
83
if (key_type == HASH_KEY_IS_STRING ) {
84
- ekey = php_url_encode (key , key_len , & ekey_len );
84
+ if (enc_type == PHP_QUERY_RFC3986 ) {
85
+ ekey = php_raw_url_encode (key , key_len , & ekey_len );
86
+ } else {
87
+ ekey = php_url_encode (key , key_len , & ekey_len );
88
+ }
85
89
newprefix_len = key_suffix_len + ekey_len + key_prefix_len + 3 /* %5B */ ;
86
90
newprefix = emalloc (newprefix_len + 1 );
87
91
p = newprefix ;
@@ -132,7 +136,7 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
132
136
* p = '\0' ;
133
137
}
134
138
ht -> nApplyCount ++ ;
135
- php_url_encode_hash_ex (HASH_OF (* zdata ), formstr , NULL , 0 , newprefix , newprefix_len , "%5D" , 3 , (Z_TYPE_PP (zdata ) == IS_OBJECT ? * zdata : NULL ), arg_sep TSRMLS_CC );
139
+ php_url_encode_hash_ex (HASH_OF (* zdata ), formstr , NULL , 0 , newprefix , newprefix_len , "%5D" , 3 , (Z_TYPE_PP (zdata ) == IS_OBJECT ? * zdata : NULL ), arg_sep , enc_type TSRMLS_CC );
136
140
ht -> nApplyCount -- ;
137
141
efree (newprefix );
138
142
} else if (Z_TYPE_PP (zdata ) == IS_NULL || Z_TYPE_PP (zdata ) == IS_RESOURCE ) {
@@ -145,7 +149,11 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
145
149
/* Simple key=value */
146
150
smart_str_appendl (formstr , key_prefix , key_prefix_len );
147
151
if (key_type == HASH_KEY_IS_STRING ) {
148
- ekey = php_url_encode (key , key_len , & ekey_len );
152
+ if (enc_type == PHP_QUERY_RFC3986 ) {
153
+ ekey = php_raw_url_encode (key , key_len , & ekey_len );
154
+ } else {
155
+ ekey = php_url_encode (key , key_len , & ekey_len );
156
+ }
149
157
smart_str_appendl (formstr , ekey , ekey_len );
150
158
efree (ekey );
151
159
} else {
@@ -161,7 +169,11 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
161
169
smart_str_appendl (formstr , "=" , 1 );
162
170
switch (Z_TYPE_PP (zdata )) {
163
171
case IS_STRING :
164
- ekey = php_url_encode (Z_STRVAL_PP (zdata ), Z_STRLEN_PP (zdata ), & ekey_len );
172
+ if (enc_type == PHP_QUERY_RFC3986 ) {
173
+ ekey = php_raw_url_encode (Z_STRVAL_PP (zdata ), Z_STRLEN_PP (zdata ), & ekey_len );
174
+ } else {
175
+ ekey = php_url_encode (Z_STRVAL_PP (zdata ), Z_STRLEN_PP (zdata ), & ekey_len );
176
+ }
165
177
break ;
166
178
case IS_LONG :
167
179
case IS_BOOL :
@@ -176,7 +188,11 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
176
188
* copyzval = * * zdata ;
177
189
zval_copy_ctor (copyzval );
178
190
convert_to_string_ex (& copyzval );
179
- ekey = php_url_encode (Z_STRVAL_P (copyzval ), Z_STRLEN_P (copyzval ), & ekey_len );
191
+ if (enc_type == PHP_QUERY_RFC3986 ) {
192
+ ekey = php_raw_url_encode (Z_STRVAL_P (copyzval ), Z_STRLEN_P (copyzval ), & ekey_len );
193
+ } else {
194
+ ekey = php_url_encode (Z_STRVAL_P (copyzval ), Z_STRLEN_P (copyzval ), & ekey_len );
195
+ }
180
196
zval_ptr_dtor (& copyzval );
181
197
}
182
198
smart_str_appendl (formstr , ekey , ekey_len );
@@ -188,17 +204,17 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
188
204
}
189
205
/* }}} */
190
206
191
- /* {{{ proto string http_build_query(mixed formdata [, string prefix [, string arg_separator]])
207
+ /* {{{ proto string http_build_query(mixed formdata [, string prefix [, string arg_separator [, int enc_type] ]])
192
208
Generates a form-encoded query string from an associative array or object. */
193
209
PHP_FUNCTION (http_build_query )
194
210
{
195
211
zval * formdata ;
196
212
char * prefix = NULL , * arg_sep = NULL ;
197
213
int arg_sep_len = 0 , prefix_len = 0 ;
198
214
smart_str formstr = {0 };
199
-
215
+ long enc_type = PHP_QUERY_RFC1738 ;
200
216
201
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "z|ss " , & formdata , & prefix , & prefix_len , & arg_sep , & arg_sep_len ) != SUCCESS ) {
217
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "z|ssl " , & formdata , & prefix , & prefix_len , & arg_sep , & arg_sep_len , & enc_type ) != SUCCESS ) {
202
218
RETURN_FALSE ;
203
219
}
204
220
@@ -207,7 +223,7 @@ PHP_FUNCTION(http_build_query)
207
223
RETURN_FALSE ;
208
224
}
209
225
210
- if (php_url_encode_hash_ex (HASH_OF (formdata ), & formstr , prefix , prefix_len , NULL , 0 , NULL , 0 , (Z_TYPE_P (formdata ) == IS_OBJECT ? formdata : NULL ), arg_sep TSRMLS_CC ) == FAILURE ) {
226
+ if (php_url_encode_hash_ex (HASH_OF (formdata ), & formstr , prefix , prefix_len , NULL , 0 , NULL , 0 , (Z_TYPE_P (formdata ) == IS_OBJECT ? formdata : NULL ), arg_sep , enc_type TSRMLS_CC ) == FAILURE ) {
211
227
if (formstr .c ) {
212
228
efree (formstr .c );
213
229
}
0 commit comments