diff --git a/.travis.yml b/.travis.yml index 667f62d..0f0a1d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,6 @@ php: matrix: allow_failures: - - php: 7.1 - php: nightly before_script: diff --git a/README.md b/README.md index 9414c53..2b46c0c 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/composer.json b/composer.json index 52c180a..06c815e 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,8 @@ "ext-curl": "*" }, "require-dev": { - "phpunit/phpunit": "*" + "phpunit/phpunit": "*", + "squizlabs/php_codesniffer": "*" }, "autoload": { "psr-4": { diff --git a/src/Curl/Curl.php b/src/Curl/Curl.php index d2e0693..e4e4b90 100644 --- a/src/Curl/Curl.php +++ b/src/Curl/Curl.php @@ -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 * diff --git a/src/Curl/MultiCurl.php b/src/Curl/MultiCurl.php index 764f280..79d3c34 100644 --- a/src/Curl/MultiCurl.php +++ b/src/Curl/MultiCurl.php @@ -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); } } diff --git a/tests/PHPCurlClass/PHPCurlClassTest.php b/tests/PHPCurlClass/PHPCurlClassTest.php index c9efabb..775e511 100644 --- a/tests/PHPCurlClass/PHPCurlClassTest.php +++ b/tests/PHPCurlClass/PHPCurlClassTest.php @@ -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() diff --git a/tests/PHPCurlClass/PHPMultiCurlClassTest.php b/tests/PHPCurlClass/PHPMultiCurlClassTest.php index a30d6b9..28a0eb4 100644 --- a/tests/PHPCurlClass/PHPMultiCurlClassTest.php +++ b/tests/PHPCurlClass/PHPMultiCurlClassTest.php @@ -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); }); } diff --git a/tests/PHPCurlClass/server.php b/tests/PHPCurlClass/server.php index e1f5856..3aefcbd 100644 --- a/tests/PHPCurlClass/server.php +++ b/tests/PHPCurlClass/server.php @@ -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; diff --git a/tests/before_script.sh b/tests/before_script.sh index 949234b..a009129 100755 --- a/tests/before_script.sh +++ b/tests/before_script.sh @@ -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