diff options
Diffstat (limited to 'lib')
-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; } /** |