diff options
author | Mohammed Abdellatif <m.latief@gmail.com> | 2019-10-25 19:21:32 +0000 |
---|---|---|
committer | Mohammed Abdellatif <m.latief@gmail.com> | 2020-02-29 19:19:23 +0200 |
commit | 98d6415264c1f211f50ee7a0b336103a488c3608 (patch) | |
tree | 412bc17cede241df5f4b4b97377169f45e48c2c9 /lib/private/Http | |
parent | 1e16fa7a8fc72f2a491ff90f9a5b5a194e78d796 (diff) | |
download | nextcloud-server-98d6415264c1f211f50ee7a0b336103a488c3608.tar.gz nextcloud-server-98d6415264c1f211f50ee7a0b336103a488c3608.zip |
Add support for GuzzleHTTP 'no' proxy
The custom config allows to setup a proxy URI that is passed to
GuzzleHTTP client as request options. Guzzle has the option to receive
an array of proxies for each URI scheme as well as 'no' key value pair
to provide a list of host names that should not be proxied to.
Guzzle would automatically populate these options with HTTPS_PROXY
and NO_PROXY environment variables. However, when providing a 'proxy'
request option, default values will be overriden and it is required to
explicitly provide the 'no' value if needed.
More info:
http://docs.guzzlephp.org/en/stable/request-options.html#proxy
This commit will add support for a new config 'proxyexclude', which
takes a list of host names to be excluded.
It will also provide 'proxy' request option as an array instead of a
string to Guzzle, and populate 'http' and 'https' URI schemes with
proxy URI, and 'no' with 'proxyexclude' list.
Also, if no 'proxy' is configured, it will leave out 'proxy' request
option, so it won't override Guzzle default values.
Sample config file includes a hint on how to explicitly sync
'proxyexclude' with NO_PROXY, and a note about default values.
Signed-off-by: Mohammed Abdellatif <m.latief@gmail.com>
Diffstat (limited to 'lib/private/Http')
-rw-r--r-- | lib/private/Http/Client/Client.php | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/lib/private/Http/Client/Client.php b/lib/private/Http/Client/Client.php index c52d90ff8ec..657bfb8d536 100644 --- a/lib/private/Http/Client/Client.php +++ b/lib/private/Http/Client/Client.php @@ -65,12 +65,20 @@ class Client implements IClient { } private function buildRequestOptions(array $options): array { + $proxy = $this->getProxyUri(); + $defaults = [ - RequestOptions::PROXY => $this->getProxyUri(), RequestOptions::VERIFY => $this->getCertBundle(), RequestOptions::TIMEOUT => 30, ]; + // Only add RequestOptions::PROXY if Nextcloud is explicitly + // configured to use a proxy. This is needed in order not to override + // Guzzle default values. + if($proxy !== null) { + $defaults[RequestOptions::PROXY] = $proxy; + } + $options = array_merge($defaults, $options); if (!isset($options[RequestOptions::HEADERS]['User-Agent'])) { @@ -96,11 +104,21 @@ class Client implements IClient { } /** - * Get the proxy URI + * Returns a null or an associative array specifiying the proxy URI for + * 'http' and 'https' schemes, in addition to a 'no' key value pair + * providing a list of host names that should not be proxied to. + * + * @return array|null + * + * The return array looks like: + * [ + * 'http' => 'username:password@proxy.example.com', + * 'https' => 'username:password@proxy.example.com', + * 'no' => ['foo.com', 'bar.com'] + * ] * - * @return string|null */ - private function getProxyUri(): ?string { + private function getProxyUri(): ?array { $proxyHost = $this->config->getSystemValue('proxy', ''); if ($proxyHost === '' || $proxyHost === null) { @@ -108,12 +126,21 @@ class Client implements IClient { } $proxyUserPwd = $this->config->getSystemValue('proxyuserpwd', ''); + if ($proxyUserPwd !== '' && $proxyUserPwd !== null) { + $proxyHost = $proxyUserPwd . '@' . $proxyHost; + } + + $proxy = [ + 'http' => $proxyHost, + 'https' => $proxyHost, + ]; - if ($proxyUserPwd === '' || $proxyUserPwd === null) { - return $proxyHost; + $proxyExclude = $this->config->getSystemValue('proxyexclude', []); + if ($proxyExclude !== [] && $proxyExclude !== null) { + $proxy['no'] = $proxyExclude; } - return $proxyUserPwd . '@' . $proxyHost; + return $proxy; } /** |