Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 37 additions & 61 deletions lib/private/Http/Client/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,11 @@
namespace OC\Http\Client;

use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use GuzzleHttp\RequestOptions;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IResponse;
use OCP\ICertificateManager;
use OCP\IConfig;
use Psr\Http\Message\RequestInterface;

/**
* Class Client
Expand All @@ -45,9 +43,6 @@ class Client implements IClient {
private $config;
/** @var ICertificateManager */
private $certificateManager;
private $configured = false;
/** @var HandlerStack */
private $stack;

/**
* @param IConfig $config
Expand All @@ -57,74 +52,62 @@ class Client implements IClient {
public function __construct(
IConfig $config,
ICertificateManager $certificateManager,
GuzzleClient $client,
HandlerStack $stack
GuzzleClient $client
) {
$this->config = $config;
$this->client = $client;
$this->stack = $stack;
$this->certificateManager = $certificateManager;
}

/**
* Sets the default options to the client
*/
private function setDefaultOptions() {
if ($this->configured) {
return;
}
$this->configured = true;
private function buildRequestOptions(array $options): array {
$defaults = [
RequestOptions::PROXY => $this->getProxyUri(),
RequestOptions::VERIFY => $this->getCertBundle(),
];

$this->stack->push(Middleware::mapRequest(function (RequestInterface $request) {
return $request
->withHeader('User-Agent', 'Nextcloud Server Crawler');
}));
}
$options = array_merge($defaults, $options);

private function getRequestOptions() {
$options = [
'verify' => $this->getCertBundle(),
];
$proxyUri = $this->getProxyUri();
if ($proxyUri !== '') {
$options['proxy'] = $proxyUri;
if (!isset($options[RequestOptions::HEADERS]['User-Agent'])) {
$options[RequestOptions::HEADERS]['User-Agent'] = 'Nextcloud Server Crawler';
}

return $options;
}

private function getCertBundle() {
private function getCertBundle(): string {
if ($this->certificateManager->listCertificates() !== []) {
return $this->certificateManager->getAbsoluteBundlePath();
} else {
// If the instance is not yet setup we need to use the static path as
// $this->certificateManager->getAbsoluteBundlePath() tries to instantiiate
// a view
if ($this->config->getSystemValue('installed', false)) {
return $this->certificateManager->getAbsoluteBundlePath(null);
} else {
return \OC::$SERVERROOT . '/resources/config/ca-bundle.crt';
}
}

// If the instance is not yet setup we need to use the static path as
// $this->certificateManager->getAbsoluteBundlePath() tries to instantiiate
// a view
if ($this->config->getSystemValue('installed', false)) {
return $this->certificateManager->getAbsoluteBundlePath(null);
}

return \OC::$SERVERROOT . '/resources/config/ca-bundle.crt';
}

/**
* Get the proxy URI
*
* @return string
* @return string|null
*/
private function getProxyUri(): string {
private function getProxyUri(): ?string {
$proxyHost = $this->config->getSystemValue('proxy', null);
$proxyUserPwd = $this->config->getSystemValue('proxyuserpwd', null);
$proxyUri = '';

if ($proxyUserPwd !== null) {
$proxyUri .= $proxyUserPwd . '@';
if ($proxyHost === null) {
return null;
}
if ($proxyHost !== null) {
$proxyUri .= $proxyHost;

$proxyUserPwd = $this->config->getSystemValue('proxyuserpwd', null);

if ($proxyUserPwd === null) {
return $proxyHost;
}

return $proxyUri;
return $proxyUserPwd . '@' . $proxyHost;
}

/**
Expand Down Expand Up @@ -157,8 +140,7 @@ private function getProxyUri(): string {
* @throws \Exception If the request could not get completed
*/
public function get(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
$response = $this->client->request('get', $uri, array_merge($this->getRequestOptions(), $options));
$response = $this->client->request('get', $uri, $this->buildRequestOptions($options));
$isStream = isset($options['stream']) && $options['stream'];
return new Response($response, $isStream);
}
Expand Down Expand Up @@ -188,8 +170,7 @@ public function get(string $uri, array $options = []): IResponse {
* @throws \Exception If the request could not get completed
*/
public function head(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
$response = $this->client->request('head', $uri, array_merge($this->getRequestOptions(), $options));
$response = $this->client->request('head', $uri, $this->buildRequestOptions($options));
return new Response($response);
}

Expand Down Expand Up @@ -223,12 +204,11 @@ public function head(string $uri, array $options = []): IResponse {
* @throws \Exception If the request could not get completed
*/
public function post(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
if (isset($options['body']) && is_array($options['body'])) {
$options['form_params'] = $options['body'];
unset($options['body']);
}
$response = $this->client->request('post', $uri, array_merge($this->getRequestOptions(), $options));
$response = $this->client->request('post', $uri, $this->buildRequestOptions($options));
return new Response($response);
}

Expand Down Expand Up @@ -262,8 +242,7 @@ public function post(string $uri, array $options = []): IResponse {
* @throws \Exception If the request could not get completed
*/
public function put(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
$response = $this->client->request('put', $uri, array_merge($this->getRequestOptions(), $options));
$response = $this->client->request('put', $uri, $this->buildRequestOptions($options));
return new Response($response);
}

Expand Down Expand Up @@ -297,12 +276,10 @@ public function put(string $uri, array $options = []): IResponse {
* @throws \Exception If the request could not get completed
*/
public function delete(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
$response = $this->client->request('delete', $uri, array_merge($this->getRequestOptions(), $options));
$response = $this->client->request('delete', $uri, $this->buildRequestOptions($options));
return new Response($response);
}


/**
* Sends a options request
*
Expand Down Expand Up @@ -333,8 +310,7 @@ public function delete(string $uri, array $options = []): IResponse {
* @throws \Exception If the request could not get completed
*/
public function options(string $uri, array $options = []): IResponse {
$this->setDefaultOptions();
$response = $this->client->request('options', $uri, array_merge($this->getRequestOptions(), $options));
$response = $this->client->request('options', $uri, $this->buildRequestOptions($options));
return new Response($response);
}
}
3 changes: 1 addition & 2 deletions lib/private/Http/Client/ClientService.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
namespace OC\Http\Client;

use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\HandlerStack;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IClientService;
use OCP\ICertificateManager;
Expand Down Expand Up @@ -55,6 +54,6 @@ public function __construct(IConfig $config,
* @return Client
*/
public function newClient(): IClient {
return new Client($this->config, $this->certificateManager, new GuzzleClient(), HandlerStack::create());
return new Client($this->config, $this->certificateManager, new GuzzleClient());
}
}
11 changes: 7 additions & 4 deletions tests/lib/Http/Client/ClientServiceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
namespace Test\Http\Client;

use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\HandlerStack;
use OC\Http\Client\Client;
use OC\Http\Client\ClientService;
use OCP\ICertificateManager;
Expand All @@ -19,12 +18,16 @@
* Class ClientServiceTest
*/
class ClientServiceTest extends \Test\TestCase {
public function testNewClient() {
public function testNewClient(): void {
/** @var IConfig $config */
$config = $this->createMock(IConfig::class);
/** @var ICertificateManager $certificateManager */
$certificateManager = $this->createMock(ICertificateManager::class);

$expected = new Client($config, $certificateManager, new GuzzleClient(), HandlerStack::create());
$clientService = new ClientService($config, $certificateManager);
$this->assertEquals($expected, $clientService->newClient());
$this->assertEquals(
new Client($config, $certificateManager, new GuzzleClient()),
$clientService->newClient()
);
}
}
Loading