Merge pull request #388 from zachborboa/master

Add additional methods and fixes to MultiCurl
This commit is contained in:
Zach Borboa
2016-09-04 03:16:17 -07:00
committed by GitHub
9 changed files with 162 additions and 80 deletions
-1
View File
@@ -12,7 +12,6 @@ php:
matrix:
allow_failures:
- php: 7.1
- php: nightly
before_script:
+5 -3
View File
@@ -29,7 +29,7 @@ For latest commit version:
### Requirements
PHP Curl Class works with PHP 5.3, 5.4, 5.5, 5.6, 7.0, and HHVM.
PHP Curl Class works with PHP 5.3, 5.4, 5.5, 5.6, 7.0, 7.1, and HHVM.
### Quick Start and Examples
@@ -187,7 +187,6 @@ Curl::close()
Curl::complete($callback)
Curl::delete($url, $query_parameters = array(), $data = array())
Curl::download($url, $mixed_filename)
Curl::downloadComplete($fh)
Curl::error($callback)
Curl::exec($ch = null)
Curl::get($url, $data = array())
@@ -195,7 +194,6 @@ Curl::getCookie($key)
Curl::getInfo($opt)
Curl::getOpt($option)
Curl::getResponseCookie($key)
Curl::getResponseCookies()
Curl::head($url, $data = array())
Curl::headerCallback($ch, $header)
Curl::options($url, $data = array())
@@ -250,13 +248,17 @@ MultiCurl::complete($callback)
MultiCurl::error($callback)
MultiCurl::getOpt($option)
MultiCurl::setBasicAuthentication($username, $password = '')
MultiCurl::setConnectTimeout($seconds)
MultiCurl::setCookie($key, $value)
MultiCurl::setCookieFile($cookie_file)
MultiCurl::setCookieJar($cookie_jar)
MultiCurl::setCookieString($string)
MultiCurl::setDigestAuthentication($username, $password = '')
MultiCurl::setHeader($key, $value)
MultiCurl::setJsonDecoder($function)
MultiCurl::setOpt($option, $value)
MultiCurl::setOpts($options)
MultiCurl::setPort($port)
MultiCurl::setReferer($referer)
MultiCurl::setReferrer($referrer)
MultiCurl::setTimeout($seconds)
+2 -1
View File
@@ -17,7 +17,8 @@
"ext-curl": "*"
},
"require-dev": {
"phpunit/phpunit": "*"
"phpunit/phpunit": "*",
"squizlabs/php_codesniffer": "*"
},
"autoload": {
"psr-4": {
+5 -17
View File
@@ -60,6 +60,7 @@ class Curl
public $requestHeaders = null;
public $responseHeaders = null;
public $rawResponseHeaders = '';
public $responseCookies = array();
public $response = null;
public $rawResponse = null;
@@ -71,7 +72,6 @@ class Curl
public $fileHandle = null;
private $cookies = array();
private $responseCookies = array();
private $headers = array();
private $options = array();
@@ -257,10 +257,10 @@ class Curl
/**
* Download Complete
*
* @access public
* @access private
* @param $fh
*/
public function downloadComplete($fh)
private function downloadComplete($fh)
{
if (!$this->error && $this->downloadCompleteFunction) {
rewind($fh);
@@ -336,8 +336,8 @@ class Curl
*/
public function exec($ch = null)
{
$this->responseCookies = array();
if ($ch === null) {
$this->responseCookies = array();
$this->call($this->beforeSendFunction);
$this->rawResponse = curl_exec($this->curl);
$this->curlErrorCode = curl_errno($this->curl);
@@ -437,7 +437,7 @@ class Curl
*/
public function getOpt($option)
{
return $this->options[$option];
return isset($this->options[$option]) ? $this->options[$option] : null;
}
/**
@@ -727,18 +727,6 @@ class Curl
return isset($this->responseCookies[$key]) ? $this->responseCookies[$key] : null;
}
/**
* Get response cookies.
*
* @access public
*
* @return array
*/
public function getResponseCookies()
{
return $this->responseCookies;
}
/**
* Set Port
*
+55 -4
View File
@@ -303,8 +303,8 @@ class MultiCurl
*/
public function close()
{
foreach ($this->curls as $ch) {
$ch->close();
foreach ($this->curls as $curl) {
$curl->close();
}
if (is_resource($this->multiCurl)) {
@@ -344,7 +344,7 @@ class MultiCurl
*/
public function getOpt($option)
{
return $this->options[$option];
return isset($this->options[$option]) ? $this->options[$option] : null;
}
/**
@@ -383,7 +383,41 @@ class MultiCurl
public function setCookie($key, $value)
{
$this->cookies[$key] = $value;
$this->setOpt(CURLOPT_COOKIE, str_replace('+', '%20', http_build_query($this->cookies, '', '; ')));
}
/**
* Set Port
*
* @access public
* @param $port
*/
public function setPort($port)
{
$this->setOpt(CURLOPT_PORT, intval($port));
}
/**
* Set Connect Timeout
*
* @access public
* @param $seconds
*/
public function setConnectTimeout($seconds)
{
$this->setOpt(CURLOPT_CONNECTTIMEOUT, $seconds);
}
/**
* Set Cookie String
*
* @access public
* @param $string
*
* @return bool
*/
public function setCookieString($string)
{
return $this->setOpt(CURLOPT_COOKIE, $string);
}
/**
@@ -458,6 +492,19 @@ class MultiCurl
$this->options[$option] = $value;
}
/**
* Set Opts
*
* @access public
* @param $options
*/
public function setOpts($options)
{
foreach ($options as $option => $value) {
$this->setOpt($option, $value);
}
}
/**
* Set Referer
*
@@ -662,6 +709,9 @@ class MultiCurl
foreach ($this->headers as $key => $value) {
$curl->setHeader($key, $value);
}
foreach ($this->cookies as $key => $value) {
$curl->setCookie($key, $value);
}
$curl->setJsonDecoder($this->jsonDecoder);
$curl->setXmlDecoder($this->xmlDecoder);
@@ -671,6 +721,7 @@ class MultiCurl
}
$this->activeCurls[$curl->id] = $curl;
$this->responseCookies = array();
$curl->call($curl->beforeSendFunction);
}
}
+15 -23
View File
@@ -201,53 +201,46 @@ class CurlTest extends PHPUnit_Framework_TestCase
$data = array('key' => 'value');
$curl = new Curl();
$curl->setHeader('X-DEBUG-TEST', 'get');
$curl->setUrl(Test::TEST_URL);
$curl->delete($data);
$this->assertEquals(Test::TEST_URL, $curl->baseUrl);
$this->assertEquals('key=value', $curl->response);
$this->assertEquals('DELETE /?key=value HTTP/1.1', $curl->requestHeaders['Request-Line']);
$this->assertEquals(Test::TEST_URL . '?key=value', $curl->effectiveUrl);
$curl = new Curl();
$curl->setHeader('X-DEBUG-TEST', 'get');
$curl->setUrl(Test::TEST_URL);
$curl->get($data);
$this->assertEquals(Test::TEST_URL, $curl->baseUrl);
$this->assertEquals('key=value', $curl->response);
$this->assertEquals('GET /?key=value HTTP/1.1', $curl->requestHeaders['Request-Line']);
$this->assertEquals(Test::TEST_URL . '?key=value', $curl->effectiveUrl);
$curl = new Curl();
$curl->setHeader('X-DEBUG-TEST', 'get');
$curl->setUrl(Test::TEST_URL);
$curl->head($data);
$this->assertEquals(Test::TEST_URL, $curl->baseUrl);
$this->assertEquals('HEAD /?key=value HTTP/1.1', $curl->requestHeaders['Request-Line']);
$this->assertEquals(Test::TEST_URL . '?key=value', $curl->effectiveUrl);
$curl = new Curl();
$curl->setHeader('X-DEBUG-TEST', 'get');
$curl->setUrl(Test::TEST_URL);
$curl->options($data);
$this->assertEquals(Test::TEST_URL, $curl->baseUrl);
$this->assertEquals('key=value', $curl->response);
$this->assertEquals('OPTIONS /?key=value HTTP/1.1', $curl->requestHeaders['Request-Line']);
$this->assertEquals(Test::TEST_URL . '?key=value', $curl->effectiveUrl);
$curl = new Curl();
$curl->setHeader('X-DEBUG-TEST', 'request_method');
$curl->setUrl(Test::TEST_URL);
$curl->patch($data);
$this->assertEquals(Test::TEST_URL, $curl->baseUrl);
$this->assertEquals('PATCH', $curl->response);
$this->assertEquals('PATCH / HTTP/1.1', $curl->requestHeaders['Request-Line']);
$this->assertEquals(Test::TEST_URL, $curl->effectiveUrl);
$curl = new Curl();
$curl->setHeader('X-DEBUG-TEST', 'post');
$curl->setUrl(Test::TEST_URL);
$curl->post($data);
$this->assertEquals(Test::TEST_URL, $curl->baseUrl);
$this->assertEquals('key=value', $curl->response);
$this->assertEquals('POST / HTTP/1.1', $curl->requestHeaders['Request-Line']);
$this->assertEquals(Test::TEST_URL, $curl->effectiveUrl);
$curl = new Curl();
$curl->setHeader('X-DEBUG-TEST', 'put');
$curl->setUrl(Test::TEST_URL);
$curl->put($data);
$this->assertEquals(Test::TEST_URL, $curl->baseUrl);
$this->assertEquals('key=value', $curl->response);
$this->assertEquals('PUT / HTTP/1.1', $curl->requestHeaders['Request-Line']);
$this->assertEquals(Test::TEST_URL, $curl->effectiveUrl);
}
public function testEffectiveUrl()
@@ -877,9 +870,8 @@ class CurlTest extends PHPUnit_Framework_TestCase
$test->server('multiple_cookie', 'GET');
$this->assertEquals('cookie1=scrumptious,cookie2=mouthwatering', $test->curl->responseHeaders['Set-Cookie']);
$response_cookies = $test->curl->getResponseCookies();
$this->assertEquals('scrumptious', $response_cookies['cookie1']);
$this->assertEquals('mouthwatering', $response_cookies['cookie2']);
$this->assertEquals('scrumptious', $test->curl->responseCookies['cookie1']);
$this->assertEquals('mouthwatering', $test->curl->responseCookies['cookie2']);
}
public function testDefaultTimeout()
+73 -31
View File
@@ -1853,6 +1853,31 @@ class MultiCurlTest extends PHPUnit_Framework_TestCase
$this->assertEquals($curl_user_agent, $get_2->response);
}
public function testSetHeaderAndOverride()
{
$multi_curl = new MultiCurl();
$multi_curl->setHeader('header-for-all-before', 'a');
$get_1 = $multi_curl->addGet(Test::TEST_URL);
$get_1->setHeader('header-for-1st-request', '1');
$get_1->complete(function ($instance) {
PHPUnit_Framework_Assert::assertEquals('a', $instance->requestHeaders['header-for-all-before']);
PHPUnit_Framework_Assert::assertEquals('b', $instance->requestHeaders['header-for-all-after']);
PHPUnit_Framework_Assert::assertEquals('1', $instance->requestHeaders['header-for-1st-request']);
});
$get_2 = $multi_curl->addGet(Test::TEST_URL);
$get_2->setHeader('header-for-2nd-request', '2');
$get_2->complete(function ($instance) {
PHPUnit_Framework_Assert::assertEquals('a', $instance->requestHeaders['header-for-all-before']);
PHPUnit_Framework_Assert::assertEquals('b', $instance->requestHeaders['header-for-all-after']);
PHPUnit_Framework_Assert::assertEquals('2', $instance->requestHeaders['header-for-2nd-request']);
});
$multi_curl->setHeader('header-for-all-after', 'b');
$multi_curl->start();
}
public function testBasicHttpAuthSuccess()
{
$username1 = 'myusername';
@@ -1976,31 +2001,37 @@ class MultiCurlTest extends PHPUnit_Framework_TestCase
public function testCookies()
{
$data = array('key' => 'mycookie');
$multi_curl = new MultiCurl();
$multi_curl->setHeader('X-DEBUG-TEST', 'cookie');
$multi_curl->setHeader('X-DEBUG-TEST', 'setcookie');
$multi_curl->setCookie('mycookie', 'yum');
$multi_curl->setCookie('cookie-for-all-before', 'a');
$get_1 = $multi_curl->addGet(Test::TEST_URL, $data);
$get_1 = $multi_curl->addGet(Test::TEST_URL);
$get_1->setCookie('cookie-for-1st-request', '1');
$get_1->complete(function ($instance) {
PHPUnit_Framework_Assert::assertInstanceOf('Curl\Curl', $instance);
PHPUnit_Framework_Assert::assertEquals('yum', $instance->response);
PHPUnit_Framework_Assert::assertEquals('yum', $instance->responseCookies['mycookie']);
PHPUnit_Framework_Assert::assertEquals('a', $instance->responseCookies['cookie-for-all-before']);
PHPUnit_Framework_Assert::assertEquals('b', $instance->responseCookies['cookie-for-all-after']);
PHPUnit_Framework_Assert::assertEquals('1', $instance->responseCookies['cookie-for-1st-request']);
});
$get_2 = $multi_curl->addGet(Test::TEST_URL, $data);
$get_2 = $multi_curl->addGet(Test::TEST_URL);
$get_2->setCookie('cookie-for-2nd-request', '2');
$get_2->beforeSend(function ($instance) {
$instance->setCookie('mycookie', 'yummy');
});
$get_2->complete(function ($instance) {
PHPUnit_Framework_Assert::assertInstanceOf('Curl\Curl', $instance);
PHPUnit_Framework_Assert::assertEquals('yummy', $instance->response);
PHPUnit_Framework_Assert::assertEquals('yummy', $instance->responseCookies['mycookie']);
PHPUnit_Framework_Assert::assertEquals('a', $instance->responseCookies['cookie-for-all-before']);
PHPUnit_Framework_Assert::assertEquals('b', $instance->responseCookies['cookie-for-all-after']);
PHPUnit_Framework_Assert::assertEquals('2', $instance->responseCookies['cookie-for-2nd-request']);
});
$multi_curl->setCookie('cookie-for-all-after', 'b');
$multi_curl->start();
$this->assertEquals('yum', $get_1->response);
$this->assertEquals('yummy', $get_2->response);
$this->assertEquals('yum', $get_1->responseCookies['mycookie']);
$this->assertEquals('yummy', $get_2->responseCookies['mycookie']);
}
public function testJSONDecoder()
@@ -2199,65 +2230,76 @@ class MultiCurlTest extends PHPUnit_Framework_TestCase
$data = array('key' => 'value');
$multi_curl = new MultiCurl();
$multi_curl->setHeader('X-DEBUG-TEST', 'get');
$multi_curl->setUrl(Test::TEST_URL);
$multi_curl->addDelete($data)->complete(function ($instance) {
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->baseUrl);
PHPUnit_Framework_Assert::assertEquals('key=value', $instance->response);
PHPUnit_Framework_Assert::assertEquals(
'DELETE /?key=value HTTP/1.1',
$instance->requestHeaders['Request-Line']
);
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL . '?key=value', $instance->effectiveUrl);
});
$multi_curl->start();
$multi_curl = new MultiCurl();
$multi_curl->setHeader('X-DEBUG-TEST', 'get');
$multi_curl->setUrl(Test::TEST_URL);
$multi_curl->addGet($data)->complete(function ($instance) {
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->baseUrl);
PHPUnit_Framework_Assert::assertEquals('key=value', $instance->response);
PHPUnit_Framework_Assert::assertEquals(
'GET /?key=value HTTP/1.1',
$instance->requestHeaders['Request-Line']
);
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL . '?key=value', $instance->effectiveUrl);
});
$multi_curl->start();
$multi_curl = new MultiCurl();
$multi_curl->setHeader('X-DEBUG-TEST', 'get');
$multi_curl->setUrl(Test::TEST_URL);
$multi_curl->addHead($data)->complete(function ($instance) {
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->baseUrl);
PHPUnit_Framework_Assert::assertEquals(
'HEAD /?key=value HTTP/1.1',
$instance->requestHeaders['Request-Line']
);
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL . '?key=value', $instance->effectiveUrl);
});
$multi_curl->start();
$multi_curl = new MultiCurl();
$multi_curl->setHeader('X-DEBUG-TEST', 'get');
$multi_curl->setUrl(Test::TEST_URL);
$multi_curl->addOptions($data)->complete(function ($instance) {
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->baseUrl);
PHPUnit_Framework_Assert::assertEquals('key=value', $instance->response);
PHPUnit_Framework_Assert::assertEquals(
'OPTIONS /?key=value HTTP/1.1',
$instance->requestHeaders['Request-Line']
);
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL . '?key=value', $instance->effectiveUrl);
});
$multi_curl = new MultiCurl();
$multi_curl->setHeader('X-DEBUG-TEST', 'request_method');
$multi_curl->setUrl(Test::TEST_URL);
$multi_curl->addPatch($data)->complete(function ($instance) {
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->baseUrl);
PHPUnit_Framework_Assert::assertEquals('PATCH', $instance->response);
PHPUnit_Framework_Assert::assertEquals(
'PATCH / HTTP/1.1',
$instance->requestHeaders['Request-Line']
);
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->effectiveUrl);
});
$multi_curl = new MultiCurl();
$multi_curl->setHeader('X-DEBUG-TEST', 'post');
$multi_curl->setUrl(Test::TEST_URL);
$multi_curl->addPost($data)->complete(function ($instance) {
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->baseUrl);
PHPUnit_Framework_Assert::assertEquals('key=value', $instance->response);
PHPUnit_Framework_Assert::assertEquals(
'POST / HTTP/1.1',
$instance->requestHeaders['Request-Line']
);
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->effectiveUrl);
});
$multi_curl = new MultiCurl();
$multi_curl->setHeader('X-DEBUG-TEST', 'put');
$multi_curl->setUrl(Test::TEST_URL);
$multi_curl->addPut($data)->complete(function ($instance) {
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->baseUrl);
PHPUnit_Framework_Assert::assertEquals('key=value', $instance->response);
PHPUnit_Framework_Assert::assertEquals(
'PUT / HTTP/1.1',
$instance->requestHeaders['Request-Line']
);
PHPUnit_Framework_Assert::assertEquals(Test::TEST_URL, $instance->effectiveUrl);
});
}
+5
View File
@@ -143,6 +143,11 @@ if ($test === 'http_basic_auth') {
} elseif ($test === 'request_uri') {
echo $_SERVER['REQUEST_URI'];
exit;
} elseif ($test === 'setcookie') {
foreach ($_COOKIE as $key => $value) {
setcookie($key, $value);
}
exit;
} elseif ($test === 'cookiejar') {
setcookie('mycookie', 'yum');
exit;
+2
View File
@@ -37,6 +37,8 @@ elif [[ "${TRAVIS_PHP_VERSION}" == "5.6" ]]; then
php -S 127.0.0.1:8000 -t tests/PHPCurlClass/ &
elif [[ "${TRAVIS_PHP_VERSION}" == "7.0" ]]; then
php -S 127.0.0.1:8000 -t tests/PHPCurlClass/ &
elif [[ "${TRAVIS_PHP_VERSION}" == "7.1" ]]; then
php -S 127.0.0.1:8000 -t tests/PHPCurlClass/ &
elif [[ "${TRAVIS_PHP_VERSION}" == "hhvm" ]]; then
sudo add-apt-repository -y ppa:nginx/stable
sudo apt-get update