Fix #51: Prefer application/x-www-form-urlencoded when POSTing

Thanks @karboom for the report.
This commit is contained in:
Zach Borboa
2014-05-13 21:46:23 -07:00
parent aef528a568
commit fed0f616f4
2 changed files with 42 additions and 2 deletions
+8
View File
@@ -334,6 +334,7 @@ class Curl
if (is_array_multidim($data)) {
$data = http_build_multi_query($data);
} else {
$binary_data = false;
foreach ($data as $key => $value) {
// Fix "Notice: Array to string conversion" when $value in
// curl_setopt($ch, CURLOPT_POSTFIELDS, $value) is an array
@@ -344,11 +345,18 @@ class Curl
// file uploading is deprecated. Please use the CURLFile
// class instead".
} elseif (is_string($value) && strpos($value, '@') === 0) {
$binary_data = true;
if (class_exists('CURLFile')) {
$data[$key] = new CURLFile(substr($value, 1));
}
} elseif ($value instanceof CURLFile) {
$binary_data = true;
}
}
if (!$binary_data) {
$data = http_build_query($data);
}
}
}
+34 -2
View File
@@ -466,22 +466,54 @@ class CurlTest extends PHPUnit_Framework_TestCase
);
}
public function testPostUrlEncodedContentType()
public function testPostStringUrlEncodedContentType()
{
$test = new Test();
$test->server('server', 'POST', 'foo=bar');
$this->assertEquals($test->curl->request_headers['Content-Type'], 'application/x-www-form-urlencoded');
}
public function testPostFormDataContentType()
public function testPostArrayUrlEncodedContentType()
{
$test = new Test();
$test->server('server', 'POST', array(
'foo' => 'bar',
));
$this->assertEquals($test->curl->request_headers['Content-Type'], 'application/x-www-form-urlencoded');
}
public function testPostFileFormDataContentType()
{
$file_path = get_png();
$test = new Test();
$test->server('server', 'POST', array(
'image' => '@' . $file_path,
));
$this->assertEquals($test->curl->request_headers['Expect'], '100-continue');
preg_match('/^multipart\/form-data; boundary=/', $test->curl->request_headers['Content-Type'], $content_type);
$this->assertTrue(!empty($content_type));
unlink($file_path);
$this->assertFalse(file_exists($file_path));
}
public function testPostCurlFileFormDataContentType()
{
if (class_exists('CURLFile')) {
$file_path = get_png();
$test = new Test();
$test->server('server', 'POST', array(
'image' => new CURLFile($file_path),
));
$this->assertEquals($test->curl->request_headers['Expect'], '100-continue');
preg_match('/^multipart\/form-data; boundary=/', $test->curl->request_headers['Content-Type'], $content_type);
$this->assertTrue(!empty($content_type));
unlink($file_path);
$this->assertFalse(file_exists($file_path));
}
}
public function testJSONResponse()