@@ -1991,6 +1991,54 @@ static void free_cb(void *arg) /* {{{ */
1991
1991
/* }}} */
1992
1992
#endif
1993
1993
1994
+ static inline CURLcode add_simple_field (curl_mime * mime , zend_string * string_key , zval * current )
1995
+ {
1996
+ CURLcode error = CURLE_OK ;
1997
+ #if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
1998
+ curl_mimepart * part ;
1999
+ CURLcode form_error ;
2000
+ #else
2001
+ struct HttpPost * first = NULL ;
2002
+ struct HttpPost * last = NULL ;
2003
+ CURLFORMcode form_error ;
2004
+ #endif
2005
+ zend_string * postval , * tmp_postval ;
2006
+
2007
+ postval = zval_get_tmp_string (current , & tmp_postval );
2008
+
2009
+ #if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
2010
+ part = curl_mime_addpart (mime );
2011
+ if (part == NULL ) {
2012
+ zend_tmp_string_release (tmp_postval );
2013
+ zend_string_release_ex (string_key , 0 );
2014
+ return CURLE_OUT_OF_MEMORY ;
2015
+ }
2016
+ if ((form_error = curl_mime_name (part , ZSTR_VAL (string_key ))) != CURLE_OK
2017
+ || (form_error = curl_mime_data (part , ZSTR_VAL (postval ), ZSTR_LEN (postval ))) != CURLE_OK ) {
2018
+ error = form_error ;
2019
+ }
2020
+ #else
2021
+ /* The arguments after _NAMELENGTH and _CONTENTSLENGTH
2022
+ * must be explicitly cast to long in curl_formadd
2023
+ * use since curl needs a long not an int. */
2024
+ form_error = curl_formadd (& first , & last ,
2025
+ CURLFORM_COPYNAME , ZSTR_VAL (string_key ),
2026
+ CURLFORM_NAMELENGTH , ZSTR_LEN (string_key ),
2027
+ CURLFORM_COPYCONTENTS , ZSTR_VAL (postval ),
2028
+ CURLFORM_CONTENTSLENGTH , ZSTR_LEN (postval ),
2029
+ CURLFORM_END
2030
+ );
2031
+
2032
+ if (form_error != CURL_FORMADD_OK ) {
2033
+ /* Not nice to convert between enums but we only have place for one error type */
2034
+ error = (CURLcode )form_error ;
2035
+ }
2036
+ #endif
2037
+ zend_tmp_string_release (tmp_postval );
2038
+
2039
+ return error ;
2040
+ }
2041
+
1994
2042
static inline zend_result build_mime_structure_from_hash (php_curl * ch , zval * zpostfields ) /* {{{ */
1995
2043
{
1996
2044
HashTable * postfields = Z_ARRVAL_P (zpostfields );
@@ -2018,7 +2066,7 @@ static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpo
2018
2066
#endif
2019
2067
2020
2068
ZEND_HASH_FOREACH_KEY_VAL (postfields , num_key , string_key , current ) {
2021
- zend_string * postval , * tmp_postval ;
2069
+ zend_string * postval ;
2022
2070
/* Pretend we have a string_key here */
2023
2071
if (!string_key ) {
2024
2072
string_key = zend_long_to_str (num_key );
@@ -2181,36 +2229,19 @@ static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpo
2181
2229
continue ;
2182
2230
}
2183
2231
2184
- postval = zval_get_tmp_string (current , & tmp_postval );
2232
+ if (Z_TYPE_P (current ) == IS_ARRAY ) {
2233
+ zval * current_element ;
2234
+
2235
+ ZEND_HASH_FOREACH_VAL (HASH_OF (current ), current_element ) {
2236
+ add_simple_field (mime , string_key , current_element );
2237
+ } ZEND_HASH_FOREACH_END ();
2185
2238
2186
- #if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
2187
- part = curl_mime_addpart (mime );
2188
- if (part == NULL ) {
2189
- zend_tmp_string_release (tmp_postval );
2190
2239
zend_string_release_ex (string_key , 0 );
2191
- return FAILURE ;
2192
- }
2193
- if ((form_error = curl_mime_name (part , ZSTR_VAL (string_key ))) != CURLE_OK
2194
- || (form_error = curl_mime_data (part , ZSTR_VAL (postval ), ZSTR_LEN (postval ))) != CURLE_OK ) {
2195
- error = form_error ;
2240
+ continue ;
2196
2241
}
2197
- #else
2198
- /* The arguments after _NAMELENGTH and _CONTENTSLENGTH
2199
- * must be explicitly cast to long in curl_formadd
2200
- * use since curl needs a long not an int. */
2201
- form_error = curl_formadd (& first , & last ,
2202
- CURLFORM_COPYNAME , ZSTR_VAL (string_key ),
2203
- CURLFORM_NAMELENGTH , ZSTR_LEN (string_key ),
2204
- CURLFORM_COPYCONTENTS , ZSTR_VAL (postval ),
2205
- CURLFORM_CONTENTSLENGTH , ZSTR_LEN (postval ),
2206
- CURLFORM_END );
2207
2242
2208
- if (form_error != CURL_FORMADD_OK ) {
2209
- /* Not nice to convert between enums but we only have place for one error type */
2210
- error = (CURLcode )form_error ;
2211
- }
2212
- #endif
2213
- zend_tmp_string_release (tmp_postval );
2243
+ add_simple_field (mime , string_key , current );
2244
+
2214
2245
zend_string_release_ex (string_key , 0 );
2215
2246
} ZEND_HASH_FOREACH_END ();
2216
2247
0 commit comments