Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürgen Thomann <juergen_thomann@linfre.de>2022-05-06 11:22:39 +0300
committerGitHub <noreply@github.com>2022-05-06 11:22:39 +0300
commitf4f46a2989ee32f9d48672e1002b6abf774cda28 (patch)
tree6e4c03c34cbdd5ad53a538efaad293422b21d57c
parent1fa21250b43706fc2859015d0b465c01d32d1095 (diff)
Add support to exclude hosts from proxy (#19139)
-rw-r--r--config/global.ini.php1
-rw-r--r--core/Http.php10
-rw-r--r--tests/PHPUnit/Unit/HttpTest.php51
3 files changed, 62 insertions, 0 deletions
diff --git a/config/global.ini.php b/config/global.ini.php
index 34dc50cf70..14276efcd7 100644
--- a/config/global.ini.php
+++ b/config/global.ini.php
@@ -1095,6 +1095,7 @@ encryption = ; SMTP transport-layer encryption, either 'none', 'ssl', 'tls', or
type = BASIC ; proxy type for outbound/outgoing connections; currently, only BASIC is supported
host = ; Proxy host: the host name of your proxy server (mandatory)
port = ; Proxy port: the port that the proxy server listens to. There is no standard default, but 80, 1080, 3128, and 8080 are popular
+exclude = ; Comma separated list of hosts to exclude from proxy: optional; localhost is always excluded
username = ; Proxy username: optional; if specified, password is mandatory
password = ; Proxy password: optional; if specified, username is mandatory
diff --git a/core/Http.php b/core/Http.php
index ae9b0b4114..d944f5fb25 100644
--- a/core/Http.php
+++ b/core/Http.php
@@ -1096,6 +1096,16 @@ class Http
$proxyPort = Config::getInstance()->proxy['port'];
$proxyUser = Config::getInstance()->proxy['username'];
$proxyPassword = Config::getInstance()->proxy['password'];
+ $proxyExclude = Config::getInstance()->proxy['exclude'];
+
+ if (!empty($proxyExclude)) {
+ $excludes = explode(',', $proxyExclude);
+ $excludes = array_map('trim', $excludes);
+ $excludes = array_filter($excludes);
+ if (in_array($hostname, $excludes)) {
+ return array(null, null, null, null);
+ }
+ }
return array($proxyHost, $proxyPort, $proxyUser, $proxyPassword);
}
diff --git a/tests/PHPUnit/Unit/HttpTest.php b/tests/PHPUnit/Unit/HttpTest.php
new file mode 100644
index 0000000000..d66f395baf
--- /dev/null
+++ b/tests/PHPUnit/Unit/HttpTest.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Tests\Unit;
+
+use Piwik\Config;
+use Piwik\Http;
+use ReflectionMethod;
+
+/**
+ * @group Core
+ */
+class HttpTest extends \PHPUnit\Framework\TestCase
+{
+ /**
+ * @dataProvider getProxyConfigurationTestData
+ */
+ public function testgetProxyConfiguration($url, $proxyConfiguration, $expected)
+ {
+ $getProxyConfiguration = new ReflectionMethod('\\Piwik\\Http', 'getProxyConfiguration');
+ $getProxyConfiguration->setAccessible(true);
+
+ Config::getInstance()->proxy['host'] = $proxyConfiguration[0];
+ Config::getInstance()->proxy['port'] = $proxyConfiguration[1];
+ Config::getInstance()->proxy['username'] = '';
+ Config::getInstance()->proxy['password'] = '';
+ Config::getInstance()->proxy['exclude'] = $proxyConfiguration[2];
+
+ $this->assertEquals($expected, $getProxyConfiguration->invoke(new Http(), $url));
+ }
+
+ public function getProxyConfigurationTestData()
+ {
+ return array(
+ array('http://localhost/', array('', '', ''), array(null, null, null, null)),
+ array('http://localhost/', array('localhost', '8080', ''), array(null, null, null, null)),
+ array('http://example.com/', array('', '', ''), array('', '', '', '')),
+ array('http://example.com/', array('localhost', '8080', ''), array('localhost', '8080', '', '')),
+ array('http://example.com/', array('localhost', '8080', ''), array('localhost', '8080', '', '')),
+ array('http://example.com/', array('localhost', '8080', 'example.com'), array(null, null, null, null)),
+ // Ensure that accidental whitespace is ignored
+ array('http://example.com/', array('localhost', '8080', ' example.com '), array(null, null, null, null)),
+ array('http://example.com/', array('localhost', '8080', 'a.example.com,b.example.net'), array('localhost', '8080', '', '')),
+ );
+ }
+}