From 296345b0a2c20b231912a4fbef4fa6b735beddd1 Mon Sep 17 00:00:00 2001 From: Zach Borboa Date: Sun, 18 Dec 2016 11:31:38 -0800 Subject: [PATCH 1/2] Implement Curl::setCookies() --- README.md | 1 + src/Curl/Curl.php | 35 +++++++++++++++++++++++++ tests/PHPCurlClass/PHPCurlClassTest.php | 14 ++++++++++ 3 files changed, 50 insertions(+) diff --git a/README.md b/README.md index 2ecc1a9..3bf082c 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,7 @@ Curl::setCookie($key, $value) Curl::setCookieFile($cookie_file) Curl::setCookieJar($cookie_jar) Curl::setCookieString($string) +Curl::setCookies($cookies) Curl::setDefaultDecoder($decoder = 'json') Curl::setDefaultJsonDecoder() Curl::setDefaultTimeout() diff --git a/src/Curl/Curl.php b/src/Curl/Curl.php index 362a85c..3e63340 100644 --- a/src/Curl/Curl.php +++ b/src/Curl/Curl.php @@ -728,6 +728,41 @@ class Curl }, array_keys($this->cookies), array_values($this->cookies)))); } + /** + * Set Cookies + * + * @access public + * @param $cookies + */ + public function setCookies($cookies) + { + foreach ($cookies as $key => $value) { + $name_chars = array(); + foreach (str_split($key) as $name_char) { + if (!isset($this->rfc2616[$name_char])) { + $name_chars[] = rawurlencode($name_char); + } else { + $name_chars[] = $name_char; + } + } + + $value_chars = array(); + foreach (str_split($value) as $value_char) { + if (!isset($this->rfc6265[$value_char])) { + $value_chars[] = rawurlencode($value_char); + } else { + $value_chars[] = $value_char; + } + } + + $this->cookies[implode('', $name_chars)] = implode('', $value_chars); + } + + $this->setOpt(CURLOPT_COOKIE, implode('; ', array_map(function ($k, $v) { + return $k . '=' . $v; + }, array_keys($this->cookies), array_values($this->cookies)))); + } + /** * Get Cookie * diff --git a/tests/PHPCurlClass/PHPCurlClassTest.php b/tests/PHPCurlClass/PHPCurlClassTest.php index ffdc26d..b9f3987 100644 --- a/tests/PHPCurlClass/PHPCurlClassTest.php +++ b/tests/PHPCurlClass/PHPCurlClassTest.php @@ -962,6 +962,20 @@ class CurlTest extends PHPUnit_Framework_TestCase ))); } + public function testSetCookies() + { + $cookies = array( + 'mycookie' => 'yum', + 'fruit' => 'apple', + 'color' => 'red', + ); + $test = new Test(); + $test->curl->setCookies($cookies); + $test->server('cookie', 'GET'); + + $this->assertEquals(http_build_query($cookies, '', '&'), $test->curl->response); + } + public function testSetCookieEncodingSpace() { $curl = new Curl(); From 7b5dd71bd5f6d8f3cc4e38aa2abcf2e0578a52a9 Mon Sep 17 00:00:00 2001 From: Zach Borboa Date: Fri, 23 Dec 2016 00:20:51 -0800 Subject: [PATCH 2/2] Implement MultiCurl::setCookies() --- README.md | 1 + src/Curl/MultiCurl.php | 13 ++++++ tests/PHPCurlClass/PHPMultiCurlClassTest.php | 47 +++++++++++++++++++- 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3bf082c..be11422 100644 --- a/README.md +++ b/README.md @@ -270,6 +270,7 @@ MultiCurl::setCookie($key, $value) MultiCurl::setCookieFile($cookie_file) MultiCurl::setCookieJar($cookie_jar) MultiCurl::setCookieString($string) +MultiCurl::setCookies($cookies) MultiCurl::setDigestAuthentication($username, $password = '') MultiCurl::setHeader($key, $value) MultiCurl::setHeaders($headers) diff --git a/src/Curl/MultiCurl.php b/src/Curl/MultiCurl.php index 2e0b7c3..de13050 100644 --- a/src/Curl/MultiCurl.php +++ b/src/Curl/MultiCurl.php @@ -413,6 +413,19 @@ class MultiCurl $this->cookies[$key] = $value; } + /** + * Set Cookies + * + * @access public + * @param $cookies + */ + public function setCookies($cookies) + { + foreach ($cookies as $key => $value) { + $this->cookies[$key] = $value; + } + } + /** * Set Port * diff --git a/tests/PHPCurlClass/PHPMultiCurlClassTest.php b/tests/PHPCurlClass/PHPMultiCurlClassTest.php index 49b11bf..7f26464 100644 --- a/tests/PHPCurlClass/PHPMultiCurlClassTest.php +++ b/tests/PHPCurlClass/PHPMultiCurlClassTest.php @@ -1999,7 +1999,7 @@ class MultiCurlTest extends PHPUnit_Framework_TestCase $multi_curl->start(); } - public function testCookies() + public function testSetCookie() { $multi_curl = new MultiCurl(); $multi_curl->setHeader('X-DEBUG-TEST', 'setcookie'); @@ -2034,6 +2034,51 @@ class MultiCurlTest extends PHPUnit_Framework_TestCase $this->assertEquals('yummy', $get_2->responseCookies['mycookie']); } + public function testSetCookies() + { + $multi_curl = new MultiCurl(); + $multi_curl->setHeader('X-DEBUG-TEST', 'setcookie'); + $multi_curl->setCookies(array( + 'mycookie' => 'yum', + 'cookie-for-all-before' => 'a', + )); + + $get_1 = $multi_curl->addGet(Test::TEST_URL); + $get_1->setCookies(array( + 'cookie-for-1st-request' => '1', + )); + $get_1->complete(function ($instance) { + 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); + $get_2->setCookies(array( + 'cookie-for-2nd-request' => '2', + )); + $get_2->beforeSend(function ($instance) { + $instance->setCookies(array( + 'mycookie' => 'yummy', + )); + }); + $get_2->complete(function ($instance) { + 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->setCookies(array( + 'cookie-for-all-after' => 'b', + )); + $multi_curl->start(); + + $this->assertEquals('yum', $get_1->responseCookies['mycookie']); + $this->assertEquals('yummy', $get_2->responseCookies['mycookie']); + } + public function testJSONDecoder() { $multi_curl = new MultiCurl();