Add support for using relative urls with MultiCurl::add*() methods

This change allows setting a base url with MultiCurl and adding requests
using relative paths.

Fixes #628.
This commit is contained in:
Zach Borboa
2021-06-10 11:05:58 -04:00
parent 48d7193a0b
commit 5d7aad1460
4 changed files with 162 additions and 3 deletions
+1 -1
View File
@@ -339,7 +339,7 @@ MultiCurl::setReferer($referer)
MultiCurl::setReferrer($referrer)
MultiCurl::setRetry($mixed)
MultiCurl::setTimeout($seconds)
MultiCurl::setUrl($url)
MultiCurl::setUrl($url, $mixed_data = '')
MultiCurl::setUserAgent($user_agent)
MultiCurl::setXmlDecoder($mixed)
MultiCurl::start()
+17
View File
@@ -0,0 +1,17 @@
<?php
require __DIR__ . '/../vendor/autoload.php';
use Curl\MultiCurl;
$multi_curl = new MultiCurl('https://www.example.com/sites/');
$get_1 = $multi_curl->addGet('page1.html');
assert($get_1->url === 'https://www.example.com/sites/page1.html');
$get_2 = $multi_curl->addGet('page2.html');
assert($get_2->url === 'https://www.example.com/sites/page2.html');
$get_3 = $multi_curl->addGet('page3.html');
assert($get_3->url === 'https://www.example.com/sites/page3.html');
$multi_curl->start();
+27 -2
View File
@@ -73,6 +73,8 @@ class MultiCurl
$query_parameters = $url;
$url = $this->baseUrl;
}
$this->setUrl($url, $query_parameters);
$curl = new Curl($this->baseUrl);
$this->queueHandle($curl);
$curl->setUrl($url, $query_parameters);
@@ -92,6 +94,8 @@ class MultiCurl
*/
public function addDownload($url, $mixed_filename)
{
$this->setUrl($url);
$curl = new Curl($this->baseUrl);
$this->queueHandle($curl);
$curl->setUrl($url);
@@ -156,6 +160,8 @@ class MultiCurl
$data = $url;
$url = $this->baseUrl;
}
$this->setUrl($url, $data);
$curl = new Curl($this->baseUrl);
$this->queueHandle($curl);
$curl->setUrl($url, $data);
@@ -179,6 +185,8 @@ class MultiCurl
$data = $url;
$url = $this->baseUrl;
}
$this->setUrl($url, $data);
$curl = new Curl($this->baseUrl);
$this->queueHandle($curl);
$curl->setUrl($url, $data);
@@ -202,6 +210,8 @@ class MultiCurl
$data = $url;
$url = $this->baseUrl;
}
$this->setUrl($url, $data);
$curl = new Curl($this->baseUrl);
$this->queueHandle($curl);
$curl->setUrl($url, $data);
@@ -225,6 +235,7 @@ class MultiCurl
$data = $url;
$url = $this->baseUrl;
}
$this->setUrl($url, $data);
$curl = new Curl($this->baseUrl);
@@ -258,6 +269,7 @@ class MultiCurl
$data = $url;
$url = $this->baseUrl;
}
$this->setUrl($url, $data);
$curl = new Curl($this->baseUrl);
$this->queueHandle($curl);
@@ -296,6 +308,8 @@ class MultiCurl
$data = $url;
$url = $this->baseUrl;
}
$this->setUrl($url, $data);
$curl = new Curl($this->baseUrl);
$this->queueHandle($curl);
$curl->setUrl($url);
@@ -323,6 +337,8 @@ class MultiCurl
$data = $url;
$url = $this->baseUrl;
}
$this->setUrl($url, $data);
$curl = new Curl($this->baseUrl);
$this->queueHandle($curl);
$curl->setUrl($url);
@@ -858,10 +874,19 @@ class MultiCurl
*
* @access public
* @param $url
* @param $mixed_data
*/
public function setUrl($url)
public function setUrl($url, $mixed_data = '')
{
$this->baseUrl = $url;
$built_url = Url::buildUrl($url, $mixed_data);
if ($this->baseUrl === null) {
$this->baseUrl = (string)new Url($built_url);
} else {
$this->baseUrl = (string)new Url($this->baseUrl, $built_url);
}
$this->setOpt(CURLOPT_URL, $this->baseUrl);
}
/**
@@ -3264,6 +3264,123 @@ class MultiCurlTest extends \PHPUnit\Framework\TestCase
}
}
public function testRelativeUrl()
{
$multi_curl = new MultiCurl(Test::TEST_URL . 'path/');
$this->assertEquals('http://127.0.0.1:8000/path/', (string)$multi_curl->baseUrl);
$get_1 = $multi_curl->addGet('test', array(
'a' => '1',
'b' => '2',
));
$this->assertEquals('http://127.0.0.1:8000/path/test?a=1&b=2', (string)$get_1->url);
$get_2 = $multi_curl->addGet('/root', array(
'c' => '3',
'd' => '4',
));
$this->assertEquals('http://127.0.0.1:8000/root?c=3&d=4', (string)$get_2->url);
$tests = array(
array(
'args' => array(
'http://www.example.com/',
'/foo',
),
'expected' => 'http://www.example.com/foo',
),
array(
'args' => array(
'http://www.example.com/',
'/foo/',
),
'expected' => 'http://www.example.com/foo/',
),
array(
'args' => array(
'http://www.example.com/',
'/dir/page.html',
),
'expected' => 'http://www.example.com/dir/page.html',
),
array(
'args' => array(
'http://www.example.com/dir1/page2.html',
'/dir/page.html',
),
'expected' => 'http://www.example.com/dir/page.html',
),
array(
'args' => array(
'http://www.example.com/dir1/page2.html',
'dir/page.html',
),
'expected' => 'http://www.example.com/dir1/dir/page.html',
),
array(
'args' => array(
'http://www.example.com/dir1/dir3/page.html',
'../dir/page.html',
),
'expected' => 'http://www.example.com/dir1/dir/page.html',
),
);
foreach ($tests as $test) {
$multi_curl = new MultiCurl($test['args']['0']);
$multi_curl->setUrl($test['args']['1']);
$this->assertEquals(
$test['expected'],
$multi_curl->getOpt(CURLOPT_URL),
"Joint URLs: '{$test['args']['0']}', '{$test['args']['1']}'"
);
$multi_curl = new MultiCurl($test['args']['0']);
$multi_curl->setUrl($test['args']['1'], array('a' => '1', 'b' => '2'));
$this->assertEquals(
$test['expected'] . '?a=1&b=2',
$multi_curl->getOpt(CURLOPT_URL),
"Joint URL '{$test['args']['0']}' with parameters a=1, b=2"
);
$multi_curl = new MultiCurl();
$multi_curl->setUrl($test['args']['0']);
$multi_curl->setUrl($test['args']['1']);
$this->assertEquals(
$test['expected'],
$multi_curl->getOpt(CURLOPT_URL),
"Joint URLs: '{$test['args']['0']}', '{$test['args']['1']}'"
);
$multi_curl = new MultiCurl();
$multi_curl->setUrl($test['args']['0'], array('a' => '1', 'b' => '2'));
$multi_curl->setUrl($test['args']['1']);
$this->assertEquals(
$test['expected'],
$multi_curl->getOpt(CURLOPT_URL),
"Joint URL '{$test['args']['0']}' with parameters a=1, b=2 and URL '{$test['args']['1']}'"
);
$multi_curl = new MultiCurl();
$multi_curl->setUrl($test['args']['0']);
$multi_curl->setUrl($test['args']['1'], array('a' => '1', 'b' => '2'));
$this->assertEquals(
$test['expected'] . '?a=1&b=2',
$multi_curl->getOpt(CURLOPT_URL),
"Joint URL '{$test['args']['0']}' and URL '{$test['args']['1']}' with parameters a=1, b=2"
);
$multi_curl = new MultiCurl();
$multi_curl->setUrl($test['args']['0'], array('a' => '1', 'b' => '2'));
$multi_curl->setUrl($test['args']['1'], array('c' => '3', 'd' => '4'));
$this->assertEquals(
$test['expected'] . '?c=3&d=4',
$multi_curl->getOpt(CURLOPT_URL),
"Joint URL '{$test['args']['0']}' with parameters a=1, b=2 " .
"and URL '{$test['args']['1']}' with parameters c=3, d=4"
);
}
}
public function testPostDataEmptyJson()
{
$multi_curl = new MultiCurl();