Merge pull request #737 from zachborboa/master

Pass MultiCurl options to new Curl instances earlier
This commit is contained in:
Zach Borboa
2022-11-05 14:21:30 -07:00
committed by GitHub
4 changed files with 62 additions and 31 deletions
+2 -1
View File
@@ -195,7 +195,7 @@ More examples are available under [/examples](https://github.com/php-curl-class/
### Available Methods
```php
Curl::__construct($base_url = null)
Curl::__construct($base_url = null, $options = [])
Curl::__destruct()
Curl::__get($name)
Curl::_fastDownload($url, $filename, $connections = 4) {
@@ -268,6 +268,7 @@ Curl::setCookieJar($cookie_jar)
Curl::setCookieString($string)
Curl::setCookies($cookies)
Curl::setDefaultDecoder($mixed = 'json')
Curl::setDefaultHeaderOut()
Curl::setDefaultJsonDecoder()
Curl::setDefaultTimeout()
Curl::setDefaultUserAgent()
+35 -6
View File
@@ -112,14 +112,14 @@ class Curl
* @param $base_url
* @throws \ErrorException
*/
public function __construct($base_url = null)
public function __construct($base_url = null, $options = [])
{
if (!extension_loaded('curl')) {
throw new \ErrorException('cURL library is not loaded');
}
$this->curl = curl_init();
$this->initialize($base_url);
$this->initialize($base_url, $options);
}
/**
@@ -1033,6 +1033,16 @@ class Curl
}
}
/**
* Set Default Header Out
*
* @access public
*/
public function setDefaultHeaderOut()
{
$this->setOpt(CURLINFO_HEADER_OUT, true);
}
/**
* Set Default Timeout
*
@@ -1610,6 +1620,10 @@ class Curl
$this->curl = curl_init();
}
$this->setDefaultUserAgent();
$this->setDefaultTimeout();
$this->setDefaultHeaderOut();
$this->initialize();
}
@@ -2123,12 +2137,27 @@ class Curl
* @access private
* @param $base_url
*/
private function initialize($base_url = null)
private function initialize($base_url = null, $options = [])
{
if (isset($options)) {
$this->setOpts($options);
}
$this->id = uniqid('', true);
$this->setDefaultUserAgent();
$this->setDefaultTimeout();
$this->setOpt(CURLINFO_HEADER_OUT, true);
// Only set default user agent if not already set.
if (!array_key_exists(CURLOPT_USERAGENT, $this->options)) {
$this->setDefaultUserAgent();
}
// Only set default timeout if not already set.
if (!array_key_exists(CURLOPT_TIMEOUT, $this->options)) {
$this->setDefaultTimeout();
}
if (!array_key_exists(CURLINFO_HEADER_OUT, $this->options)) {
$this->setDefaultHeaderOut();
}
// Create a placeholder to temporarily store the header callback data.
$header_callback_data = new \stdClass();
+9 -12
View File
@@ -80,7 +80,7 @@ class MultiCurl
$url = $this->baseUrl;
}
$curl = new Curl($this->baseUrl);
$curl = new Curl($this->baseUrl, $this->options);
$this->queueHandle($curl);
$this->setUrl($url, $query_parameters);
$curl->setUrl($url, $query_parameters);
@@ -100,7 +100,7 @@ class MultiCurl
*/
public function addDownload($url, $mixed_filename)
{
$curl = new Curl($this->baseUrl);
$curl = new Curl($this->baseUrl, $this->options);
$this->queueHandle($curl);
$this->setUrl($url);
$curl->setUrl($url);
@@ -166,7 +166,7 @@ class MultiCurl
$url = $this->baseUrl;
}
$curl = new Curl($this->baseUrl);
$curl = new Curl($this->baseUrl, $this->options);
$this->queueHandle($curl);
$this->setUrl($url, $data);
$curl->setUrl($url, $data);
@@ -191,7 +191,7 @@ class MultiCurl
$url = $this->baseUrl;
}
$curl = new Curl($this->baseUrl);
$curl = new Curl($this->baseUrl, $this->options);
$this->queueHandle($curl);
$this->setUrl($url, $data);
$curl->setUrl($url, $data);
@@ -216,7 +216,7 @@ class MultiCurl
$url = $this->baseUrl;
}
$curl = new Curl($this->baseUrl);
$curl = new Curl($this->baseUrl, $this->options);
$this->queueHandle($curl);
$this->setUrl($url, $data);
$curl->setUrl($url, $data);
@@ -241,7 +241,7 @@ class MultiCurl
$url = $this->baseUrl;
}
$curl = new Curl($this->baseUrl);
$curl = new Curl($this->baseUrl, $this->options);
if (is_array($data) && empty($data)) {
$curl->removeHeader('Content-Length');
@@ -275,7 +275,7 @@ class MultiCurl
$url = $this->baseUrl;
}
$curl = new Curl($this->baseUrl);
$curl = new Curl($this->baseUrl, $this->options);
$this->queueHandle($curl);
$this->setUrl($url);
@@ -314,7 +314,7 @@ class MultiCurl
$url = $this->baseUrl;
}
$curl = new Curl($this->baseUrl);
$curl = new Curl($this->baseUrl, $this->options);
$this->queueHandle($curl);
$this->setUrl($url);
$curl->setUrl($url);
@@ -343,7 +343,7 @@ class MultiCurl
$url = $this->baseUrl;
}
$curl = new Curl($this->baseUrl);
$curl = new Curl($this->baseUrl, $this->options);
$this->queueHandle($curl);
$this->setUrl($url);
$curl->setUrl($url);
@@ -1261,9 +1261,6 @@ class MultiCurl
$curl->setXmlDecoder($this->xmlDecoder);
}
// Pass options set on the MultiCurl instance to the Curl instance.
$curl->setOpts($this->options);
// Set instance-specific options on the Curl instance when present.
if (isset($this->instanceSpecificOptions[$curl->id])) {
$curl->setOpts($this->instanceSpecificOptions[$curl->id]);
+16 -12
View File
@@ -2059,31 +2059,35 @@ class MultiCurlTest extends \PHPUnit\Framework\TestCase
public function testSetOptAndSetOptOverride()
{
$multi_curl_user_agent = 'multi curl user agent';
$curl_user_agent = 'curl user agent';
$curl_user_agent_2 = 'curl user agent 2';
$curl_user_agent_3 = 'curl user agent 3';
$data = ['key' => 'HTTP_USER_AGENT'];
$multi_curl = new MultiCurl();
$multi_curl->setHeader('X-DEBUG-TEST', 'server');
$multi_curl->setOpt(CURLOPT_USERAGENT, $multi_curl_user_agent);
$get_1 = $multi_curl->addGet(Test::TEST_URL, $data);
$get_1->complete(function ($instance) use ($multi_curl_user_agent) {
\PHPUnit\Framework\Assert::assertEquals($multi_curl_user_agent, $instance->getOpt(CURLOPT_USERAGENT));
});
$get_2 = $multi_curl->addGet(Test::TEST_URL, $data);
$get_2->complete(function ($instance) use ($multi_curl_user_agent) {
\PHPUnit\Framework\Assert::assertEquals($multi_curl_user_agent, $instance->getOpt(CURLOPT_USERAGENT));
\PHPUnit\Framework\Assert::assertEquals($multi_curl_user_agent, $instance->response);
});
$get_3 = $multi_curl->addGet(Test::TEST_URL, $data);
$get_3->beforeSend(function ($instance) use ($curl_user_agent) {
$instance->setOpt(CURLOPT_USERAGENT, $curl_user_agent);
$get_2 = $multi_curl->addGet(Test::TEST_URL, $data);
$get_2->setOpt(CURLOPT_USERAGENT, $curl_user_agent_2);
$get_2->complete(function ($instance) use ($curl_user_agent_2) {
\PHPUnit\Framework\Assert::assertEquals($curl_user_agent_2, $instance->getOpt(CURLOPT_USERAGENT));
\PHPUnit\Framework\Assert::assertEquals($curl_user_agent_2, $instance->response);
});
$get_3->complete(function ($instance) use ($curl_user_agent) {
\PHPUnit\Framework\Assert::assertEquals($curl_user_agent, $instance->getOpt(CURLOPT_USERAGENT));
\PHPUnit\Framework\Assert::assertEquals($curl_user_agent, $instance->response);
$get_3 = $multi_curl->addGet(Test::TEST_URL, $data);
$get_3->beforeSend(function ($instance) use ($curl_user_agent_3) {
$instance->setOpt(CURLOPT_USERAGENT, $curl_user_agent_3);
});
$get_3->complete(function ($instance) use ($curl_user_agent_3) {
\PHPUnit\Framework\Assert::assertEquals($curl_user_agent_3, $instance->getOpt(CURLOPT_USERAGENT));
\PHPUnit\Framework\Assert::assertEquals($curl_user_agent_3, $instance->response);
});
$multi_curl->start();