2022-02-23 15:58:18 +00:00
|
|
|
<?php declare(strict_types=1);
|
2019-11-29 16:47:40 +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;
|
|
|
|
|
|
|
|
use Composer\Util\NoProxyPattern;
|
2020-02-07 03:18:45 +00:00
|
|
|
use Composer\Test\TestCase;
|
2019-11-29 16:47:40 +00:00
|
|
|
|
|
|
|
class NoProxyPatternTest extends TestCase
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @dataProvider dataHostName
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param string $noproxy
|
|
|
|
* @param string $url
|
|
|
|
* @param bool $expected
|
2019-11-29 16:47:40 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testHostName(string $noproxy, string $url, bool $expected): void
|
2019-11-29 16:47:40 +00:00
|
|
|
{
|
|
|
|
$matcher = new NoProxyPattern($noproxy);
|
|
|
|
$url = $this->getUrl($url);
|
|
|
|
$this->assertEquals($expected, $matcher->test($url));
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataHostName(): array
|
2019-11-29 16:47:40 +00:00
|
|
|
{
|
|
|
|
$noproxy = 'foobar.com, .barbaz.net';
|
|
|
|
|
|
|
|
// noproxy, url, expected
|
|
|
|
return array(
|
2021-02-25 12:46:52 +00:00
|
|
|
'match as foobar.com' => array($noproxy, 'foobar.com', true),
|
|
|
|
'match foobar.com' => array($noproxy, 'www.foobar.com', true),
|
|
|
|
'no match foobar.com' => array($noproxy, 'foofoobar.com', false),
|
|
|
|
'match .barbaz.net 1' => array($noproxy, 'barbaz.net', true),
|
|
|
|
'match .barbaz.net 2' => array($noproxy, 'www.barbaz.net', true),
|
|
|
|
'no match .barbaz.net' => array($noproxy, 'barbarbaz.net', false),
|
|
|
|
'no match wrong domain' => array($noproxy, 'barbaz.com', false),
|
|
|
|
'no match FQDN' => array($noproxy, 'foobar.com.', false),
|
2019-11-29 16:47:40 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataIpAddress
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param string $noproxy
|
|
|
|
* @param string $url
|
|
|
|
* @param bool $expected
|
2019-11-29 16:47:40 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testIpAddress(string $noproxy, string $url, bool $expected): void
|
2019-11-29 16:47:40 +00:00
|
|
|
{
|
|
|
|
$matcher = new NoProxyPattern($noproxy);
|
|
|
|
$url = $this->getUrl($url);
|
|
|
|
$this->assertEquals($expected, $matcher->test($url));
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataIpAddress(): array
|
2019-11-29 16:47:40 +00:00
|
|
|
{
|
2019-11-30 15:45:54 +00:00
|
|
|
$noproxy = '192.168.1.1, 2001:db8::52:0:1';
|
2019-11-29 16:47:40 +00:00
|
|
|
|
|
|
|
// noproxy, url, expected
|
|
|
|
return array(
|
2021-02-25 12:46:52 +00:00
|
|
|
'match exact IPv4' => array($noproxy, '192.168.1.1', true),
|
|
|
|
'no match IPv4' => array($noproxy, '192.168.1.4', false),
|
|
|
|
'match exact IPv6' => array($noproxy, '[2001:db8:0:0:0:52:0:1]', true),
|
|
|
|
'no match IPv6' => array($noproxy, '[2001:db8:0:0:0:52:0:2]', false),
|
|
|
|
'match mapped IPv4' => array($noproxy, '[::FFFF:C0A8:0101]', true),
|
|
|
|
'no match mapped IPv4' => array($noproxy, '[::FFFF:C0A8:0104]', false),
|
2019-11-29 16:47:40 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataIpRange
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param string $noproxy
|
|
|
|
* @param string $url
|
|
|
|
* @param bool $expected
|
2019-11-29 16:47:40 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testIpRange(string $noproxy, string $url, bool $expected): void
|
2019-11-29 16:47:40 +00:00
|
|
|
{
|
|
|
|
$matcher = new NoProxyPattern($noproxy);
|
|
|
|
$url = $this->getUrl($url);
|
|
|
|
$this->assertEquals($expected, $matcher->test($url));
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataIpRange(): array
|
2019-11-29 16:47:40 +00:00
|
|
|
{
|
2019-11-30 15:45:54 +00:00
|
|
|
$noproxy = '10.0.0.0/30, 2002:db8:a::45/121';
|
2019-11-29 16:47:40 +00:00
|
|
|
|
|
|
|
// noproxy, url, expected
|
|
|
|
return array(
|
2021-02-25 12:46:52 +00:00
|
|
|
'match IPv4/CIDR' => array($noproxy, '10.0.0.2', true),
|
|
|
|
'no match IPv4/CIDR' => array($noproxy, '10.0.0.4', false),
|
|
|
|
'match IPv6/CIDR' => array($noproxy, '[2002:db8:a:0:0:0:0:7f]', true),
|
|
|
|
'no match IPv6' => array($noproxy, '[2002:db8:a:0:0:0:0:ff]', false),
|
|
|
|
'match mapped IPv4' => array($noproxy, '[::FFFF:0A00:0002]', true),
|
|
|
|
'no match mapped IPv4' => array($noproxy, '[::FFFF:0A00:0004]', false),
|
2019-11-29 16:47:40 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataPort
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @param string $noproxy
|
|
|
|
* @param string $url
|
|
|
|
* @param bool $expected
|
2019-11-29 16:47:40 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
public function testPort(string $noproxy, string $url, bool $expected): void
|
2019-11-29 16:47:40 +00:00
|
|
|
{
|
|
|
|
$matcher = new NoProxyPattern($noproxy);
|
|
|
|
$url = $this->getUrl($url);
|
|
|
|
$this->assertEquals($expected, $matcher->test($url));
|
|
|
|
}
|
|
|
|
|
2022-02-21 12:42:28 +00:00
|
|
|
public function dataPort(): array
|
2019-11-29 16:47:40 +00:00
|
|
|
{
|
|
|
|
$noproxy = '192.168.1.2:81, 192.168.1.3:80, [2001:db8::52:0:2]:443, [2001:db8::52:0:3]:80';
|
|
|
|
|
|
|
|
// noproxy, url, expected
|
|
|
|
return array(
|
2021-02-25 12:46:52 +00:00
|
|
|
'match IPv4 port' => array($noproxy, '192.168.1.3', true),
|
|
|
|
'no match IPv4 port' => array($noproxy, '192.168.1.2', false),
|
|
|
|
'match IPv6 port' => array($noproxy, '[2001:db8::52:0:3]', true),
|
|
|
|
'no match IPv6 port' => array($noproxy, '[2001:db8::52:0:2]', false),
|
2019-11-29 16:47:40 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Appends a scheme to the test url if it is missing
|
|
|
|
*
|
|
|
|
* @param string $url
|
2021-10-27 14:18:46 +00:00
|
|
|
*
|
|
|
|
* @return string
|
2019-11-29 16:47:40 +00:00
|
|
|
*/
|
2022-02-22 15:47:09 +00:00
|
|
|
private function getUrl(string $url): string
|
2019-11-29 16:47:40 +00:00
|
|
|
{
|
|
|
|
if (parse_url($url, PHP_URL_SCHEME)) {
|
|
|
|
return $url;
|
|
|
|
}
|
|
|
|
|
|
|
|
$scheme = 'http';
|
|
|
|
|
|
|
|
if (strpos($url, '[') !== 0 && strrpos($url, ':') !== false) {
|
|
|
|
list(, $port) = explode(':', $url);
|
|
|
|
|
|
|
|
if ($port === '443') {
|
|
|
|
$scheme = 'https';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return sprintf('%s://%s', $scheme, $url);
|
|
|
|
}
|
|
|
|
}
|