summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/curl/interface.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index 0e9ac1ee67..982748092f 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -1582,17 +1582,37 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
* must be explicitly cast to long in curl_formadd
* use since curl needs a long not an int. */
if (*postval == '@') {
+ char *type;
++postval;
+
+ if ((type = php_memnstr(postval, ";type=", sizeof(";type=") - 1, postval + strlen(postval)))) {
+ *type = '\0';
+ }
/* safe_mode / open_basedir check */
if (php_check_open_basedir(postval TSRMLS_CC) || (PG(safe_mode) && !php_checkuid(postval, "rb+", CHECKUID_CHECK_MODE_PARAM))) {
+ if (type) {
+ *type = ';';
+ }
RETVAL_FALSE;
return 1;
}
- error = curl_formadd(&first, &last,
+ if (type) {
+ type++;
+ error = curl_formadd(&first, &last,
+ CURLFORM_COPYNAME, string_key,
+ CURLFORM_NAMELENGTH, (long)string_key_len - 1,
+ CURLFORM_FILE, postval,
+ CURLFORM_CONTENTTYPE, type,
+ CURLFORM_END);
+ *(type - 1) = ';';
+ } else {
+ error = curl_formadd(&first, &last,
CURLFORM_COPYNAME, string_key,
CURLFORM_NAMELENGTH, (long)string_key_len - 1,
- CURLFORM_FILE, postval,
+ CURLFORM_FILE, postval,
CURLFORM_END);
+
+ }
} else {
error = curl_formadd(&first, &last,
CURLFORM_COPYNAME, string_key,