2022-02-23 15:58:18 +00:00
|
|
|
<?php declare(strict_types=1);
|
2020-09-24 15:48:22 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This file is part of Composer.
|
|
|
|
*
|
|
|
|
* (c) Nils Adermann <naderman@naderman.de>
|
|
|
|
* Jordi Boggiano <j.boggiano@seld.be>
|
|
|
|
*
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Composer\Test\Util\Http;
|
|
|
|
|
|
|
|
use Composer\Util\Http\ProxyHelper;
|
|
|
|
use Composer\Test\TestCase;
|
|
|
|
|
|
|
|
class ProxyHelperTest extends TestCase
|
|
|
|
{
|
2021-12-08 16:03:05 +00:00
|
|
|
protected function setUp(): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
unset(
|
|
|
|
$_SERVER['HTTP_PROXY'],
|
|
|
|
$_SERVER['http_proxy'],
|
|
|
|
$_SERVER['HTTPS_PROXY'],
|
|
|
|
$_SERVER['https_proxy'],
|
|
|
|
$_SERVER['NO_PROXY'],
|
|
|
|
$_SERVER['no_proxy'],
|
|
|
|
$_SERVER['CGI_HTTP_PROXY']
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2021-12-08 16:03:05 +00:00
|
|
|
protected function tearDown(): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
2021-12-09 16:09:07 +00:00
|
|
|
parent::tearDown();
|
2020-09-24 15:48:22 +00:00
|
|
|
unset(
|
|
|
|
$_SERVER['HTTP_PROXY'],
|
|
|
|
$_SERVER['http_proxy'],
|
|
|
|
$_SERVER['HTTPS_PROXY'],
|
|
|
|
$_SERVER['https_proxy'],
|
|
|
|
$_SERVER['NO_PROXY'],
|
|
|
|
$_SERVER['no_proxy'],
|
|
|
|
$_SERVER['CGI_HTTP_PROXY']
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataMalformed
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param string $url
|
2020-09-24 15:48:22 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testThrowsOnMalformedUrl(string $url): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
$_SERVER['http_proxy'] = $url;
|
|
|
|
|
2021-12-09 19:55:26 +00:00
|
|
|
self::expectException('RuntimeException');
|
2020-09-24 15:48:22 +00:00
|
|
|
ProxyHelper::getProxyData();
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataMalformed(): array
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
return array(
|
|
|
|
'no-host' => array('localhost'),
|
|
|
|
'no-port' => array('scheme://localhost'),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataFormatting
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param string $url
|
|
|
|
* @param string $expected
|
2020-09-24 15:48:22 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testUrlFormatting(string $url, string $expected): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
$_SERVER['http_proxy'] = $url;
|
|
|
|
|
|
|
|
list($httpProxy, $httpsProxy, $noProxy) = ProxyHelper::getProxyData();
|
|
|
|
$this->assertSame($expected, $httpProxy);
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataFormatting(): array
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
// url, expected
|
|
|
|
return array(
|
|
|
|
'lowercases-scheme' => array('HTTP://proxy.com:8888', 'http://proxy.com:8888'),
|
2020-11-22 13:48:56 +00:00
|
|
|
'adds-http-port' => array('http://proxy.com', 'http://proxy.com:80'),
|
|
|
|
'adds-https-port' => array('https://proxy.com', 'https://proxy.com:443'),
|
2020-09-24 15:48:22 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataCaseOverrides
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param array<string, mixed> $server
|
|
|
|
* @param string $expected
|
|
|
|
* @param int $index
|
2020-09-24 15:48:22 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testLowercaseOverridesUppercase(array $server, string $expected, int $index): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
$_SERVER = array_merge($_SERVER, $server);
|
|
|
|
|
|
|
|
$list = ProxyHelper::getProxyData();
|
|
|
|
$this->assertSame($expected, $list[$index]);
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataCaseOverrides(): array
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
// server, expected, list index
|
|
|
|
return array(
|
|
|
|
array(array('HTTP_PROXY' => 'http://upper.com', 'http_proxy' => 'http://lower.com'), 'http://lower.com:80', 0),
|
|
|
|
array(array('HTTPS_PROXY' => 'http://upper.com', 'https_proxy' => 'http://lower.com'), 'http://lower.com:80', 1),
|
|
|
|
array(array('NO_PROXY' => 'upper.com', 'no_proxy' => 'lower.com'), 'lower.com', 2),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataCGIOverrides
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param array<string, mixed> $server
|
|
|
|
* @param string $expected
|
|
|
|
* @param int $index
|
2020-09-24 15:48:22 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testCGIUpperCaseOverridesHttp(array $server, string $expected, int $index): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
$_SERVER = array_merge($_SERVER, $server);
|
|
|
|
|
|
|
|
$list = ProxyHelper::getProxyData();
|
|
|
|
$this->assertSame($expected, $list[$index]);
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataCGIOverrides(): array
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
2020-11-22 13:48:56 +00:00
|
|
|
// server, expected, list index
|
2020-09-24 15:48:22 +00:00
|
|
|
return array(
|
|
|
|
array(array('http_proxy' => 'http://http.com', 'CGI_HTTP_PROXY' => 'http://cgi.com'), 'http://cgi.com:80', 0),
|
|
|
|
array(array('http_proxy' => 'http://http.com', 'cgi_http_proxy' => 'http://cgi.com'), 'http://http.com:80', 0),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-02-18 09:38:54 +00:00
|
|
|
public function testNoHttpsProxyUsesHttpProxy(): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
$_SERVER['http_proxy'] = 'http://http.com';
|
|
|
|
|
|
|
|
list($httpProxy, $httpsProxy, $noProxy) = ProxyHelper::getProxyData();
|
|
|
|
$this->assertSame('http://http.com:80', $httpsProxy);
|
|
|
|
}
|
|
|
|
|
2022-02-18 09:38:54 +00:00
|
|
|
public function testNoHttpProxyDoesNotUseHttpsProxy(): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
$_SERVER['https_proxy'] = 'http://https.com';
|
|
|
|
|
|
|
|
list($httpProxy, $httpsProxy, $noProxy) = ProxyHelper::getProxyData();
|
|
|
|
$this->assertSame(null, $httpProxy);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataContextOptions
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param string $url
|
|
|
|
* @param array<string, string> $expected
|
|
|
|
*
|
|
|
|
* @phpstan-param array{http: array{proxy: string, header?: string}} $expected
|
2020-09-24 15:48:22 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testGetContextOptions(string $url, array $expected): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
$this->assertEquals($expected, ProxyHelper::getContextOptions($url));
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataContextOptions(): array
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
// url, expected
|
|
|
|
return array(
|
|
|
|
array('http://proxy.com', array('http' => array(
|
|
|
|
'proxy' => 'tcp://proxy.com:80',
|
|
|
|
))),
|
|
|
|
array('https://proxy.com', array('http' => array(
|
|
|
|
'proxy' => 'ssl://proxy.com:443',
|
|
|
|
))),
|
|
|
|
array('http://user:p%40ss@proxy.com', array('http' => array(
|
|
|
|
'proxy' => 'tcp://proxy.com:80',
|
|
|
|
'header' => 'Proxy-Authorization: Basic dXNlcjpwQHNz',
|
|
|
|
))),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataRequestFullUri
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param string $requestUrl
|
|
|
|
* @param mixed[] $expected
|
2020-09-24 15:48:22 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testSetRequestFullUri(string $requestUrl, array $expected): void
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
$options = array();
|
|
|
|
ProxyHelper::setRequestFullUri($requestUrl, $options);
|
|
|
|
|
|
|
|
$this->assertEquals($expected, $options);
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataRequestFullUri(): array
|
2020-09-24 15:48:22 +00:00
|
|
|
{
|
|
|
|
$options = array('http' => array('request_fulluri' => true));
|
|
|
|
|
|
|
|
// $requestUrl, expected
|
|
|
|
return array(
|
2020-11-22 13:48:56 +00:00
|
|
|
'http' => array('http://repo.org', $options),
|
|
|
|
'https' => array('https://repo.org', array()),
|
2020-09-24 15:48:22 +00:00
|
|
|
'no-scheme' => array('repo.org', array()),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|