From f4f46a2989ee32f9d48672e1002b6abf774cda28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Thomann?= Date: Fri, 6 May 2022 10:22:39 +0200 Subject: Add support to exclude hosts from proxy (#19139) --- config/global.ini.php | 1 + core/Http.php | 10 ++++++++ tests/PHPUnit/Unit/HttpTest.php | 51 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 tests/PHPUnit/Unit/HttpTest.php 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 @@ +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', '', '')), + ); + } +} -- cgit v1.2.3