mirror of https://github.com/nextcloud/bookmarks
65 lines
2.2 KiB
PHP
65 lines
2.2 KiB
PHP
<?php
|
|
/*
|
|
* Copyright (c) 2020-2024. The Nextcloud Bookmarks contributors.
|
|
*
|
|
* This file is licensed under the Affero General Public License version 3 or later. See the COPYING file.
|
|
*/
|
|
|
|
namespace OCA\Bookmarks\Http;
|
|
|
|
use Exception;
|
|
use GuzzleHttp\Psr7;
|
|
use GuzzleHttp\Psr7\Response;
|
|
use OCP\Http\Client\IClient;
|
|
use Psr\Http\Client\ClientInterface;
|
|
use Psr\Http\Message\RequestInterface;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
|
|
class Client implements ClientInterface {
|
|
protected $nextcloudClient;
|
|
|
|
public function __construct(IClient $nextcloudClient) {
|
|
$this->nextcloudClient = $nextcloudClient;
|
|
}
|
|
|
|
/**
|
|
* * Sends a PSR-7 request and returns a PSR-7 response.
|
|
* *
|
|
* * Every technically correct HTTP response MUST be returned as-is, even if it represents an HTTP
|
|
* * error response or a redirect instruction. The only special case is 1xx responses, which MUST
|
|
* * be assembled in the HTTP client.
|
|
* *
|
|
* * The client MAY do modifications to the Request before sending it. Because PSR-7 objects are
|
|
* * immutable, one cannot assume that the object passed to ClientInterface::sendRequest() will be the same
|
|
* * object that is actually sent. For example, the Request object that is returned by an exception MAY
|
|
* * be a different object than the one passed to sendRequest, so comparison by reference (===) is not possible.
|
|
* *
|
|
* * {@link
|
|
* * https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-7-http-message-meta.md#why-value-objects}
|
|
* *
|
|
*
|
|
* @param RequestInterface $request
|
|
*
|
|
* @return Response
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
public function sendRequest(RequestInterface $request): ResponseInterface {
|
|
$method = $request->getMethod();
|
|
if ($method === 'GET' || $method === 'OPTIONS') {
|
|
$ncRes = $this->nextcloudClient->{strtolower($request->getMethod())}($request->getUri(), ['timeout' => 10]);
|
|
$res = new Response();
|
|
|
|
foreach ($ncRes->getHeaders() as $key => $value) {
|
|
$res = $res->withHeader($key, $value);
|
|
}
|
|
|
|
return $res
|
|
->withStatus($ncRes->getStatusCode())
|
|
->withBody(Psr7\Utils::streamFor($ncRes->getBody()));
|
|
}
|
|
|
|
throw new Exception('Can only send GET or OPTIONS requests'); // XXX: How should Streams be sent using nextcloud?
|
|
}
|
|
}
|