Edit report at http://bugs.php.net/bug.php?id=50060&edit=1
ID: 50060
Comment by: guille at nianoniano dot com
Reported by: bugs dot php dot net at sgerrand dot com
Summary: "failed creating formpost data" if post array value
starts with '@'
Status: Bogus
Type: Bug
Package: cURL related
Operating System: Linux (Ubuntu x86_64 2.6.31-14)
PHP Version: 5.2.11
New Comment:
We should have to be able to tell wheter a POST field is intended to be
interpreted as a path for a file submission or simply as text not just
by adding a '@' character at the begining of a POST parameter's value.
Firstly because the curl lets it and PHP's implementation of this
functions are actually diminishing this feature.
And secondly because it brings some operational problems that makes us
to produce worse code: the need to convert the POST payload array of
parameters to a string.
A good example for this need is a Twitter library that i'm currently
working on. It a very common case to have a POST parameter starting with
the '@' character and i'm forced to convert the array into a string and
then deal with other derivative problems like handling the presence of
characters like '&' in the value of a parameter. This wastes processing
time, resources and makes worse source code.
Previous Comments:
------------------------------------------------------------------------
[2009-11-03 21:37:08] bugs dot php dot net at sgerrand dot com
Regardless, if the existing functionality for constructing form data
with the CURLOPT_POSTFIELDS option will not be changed, can the
documentation for curl_setopt() be altered to more explicitly indicate
that *any* array value that starts with '@' will be treated as a file
for upload.
------------------------------------------------------------------------
[2009-11-03 11:58:30] [email protected]
-d is for the whole data, what we really have here is -F for formdata.
curl -F 'k...@value' http://www.php.net/
------------------------------------------------------------------------
[2009-11-03 10:44:13] bugs dot php dot net at sgerrand dot com
Please refer to the documentation for curl_setopt() -
http://php.net/curl_setopt
CURLOPT_POSTFIELDS The full data to post in a HTTP "POST"
operation. To post a file, prepend a filename with @ and use the full
path. This can either be passed as a urlencoded string like
'para1=val1¶2=val2&...' or as an array with the field name as key
and field data as value. If value is an array, the Content-Type header
will be set to multipart/form-data.
The case I have logged is when data to be posted using this option is
an array which happens to have a value that starts with '@', as per
the example. This edge case is being caused by the function used to
create the form data to pass to cURL.
I would note that the cURL command line client on any POSIX system can
perform this without issue - i.e.:
curl -d 'k...@value' http://www.php.net/
------------------------------------------------------------------------
[2009-11-03 10:18:06] [email protected]
@ has a special meaning with cURL and takes the contents of the file.
------------------------------------------------------------------------
[2009-11-03 07:29:36] bugs dot php dot net at sgerrand dot com
Description:
------------
PHP's cURL library dies returning the error message "failed creating
formpost data" when trying to use an array that contains a value
starting with '@'.
If the array is changed to a string in URL encoded like format, the
problem does not occur.
Reproduce code:
---------------
<?php
$url = 'http://www.php.net';
$postData = array('key' => '@value');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
if (! curl_exec($ch) ) print 'cURL error: ' . curl_error($ch);
else print "cURL success";
curl_close($ch);
?>
Expected result:
----------------
cURL success
Actual result:
--------------
cURL error: failed creating formpost data
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=50060&edit=1