Bug #50060 [Com]: "failed creating formpost data" if post array value starts with '@'

From: Date: Wed, 24 Mar 2010 08:39:13 +0000
Subject: Bug #50060 [Com]: "failed creating formpost data" if post array value starts with '@'
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-148920@lists.php.net to get a copy of this message
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] scottmac@php.net -d is for the whole data, what we really have here is -F for formdata. curl -F 'key=@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&para2=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 'key=@value' http://www.php.net/ ------------------------------------------------------------------------ [2009-11-03 10:18:06] scottmac@php.net @ 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

« previous php.bugs (#148920) next »