Add basic HTTP client for Tailbone API

with inspiration from https://packagist.org/packages/avency/gitea
This commit is contained in:
Lance Edgar 2023-05-15 12:13:54 -05:00
parent 272fd5f72b
commit 64f4ea89be
3 changed files with 80 additions and 1 deletions

1
.gitignore vendored
View file

@ -1 +1,2 @@
composer.lock
/vendor/

View file

@ -1,6 +1,7 @@
{
"name": "rattail/posterior",
"description": "Tailbone API Client",
"type": "library",
"homepage": "https://rattailproject.org",
"license": "GPL-3.0-or-later",
"autoload": {
@ -14,5 +15,7 @@
"email": "lance@edbob.org"
}
],
"require": {}
"require": {
"guzzlehttp/guzzle": "^7.0"
}
}

75
src/Client.php Normal file
View file

@ -0,0 +1,75 @@
<?php
declare(strict_types=1);
namespace Rattail\Posterior;
use Psr\Http\Message\ResponseInterface;
class Client
{
private $baseURI;
private $httpClient;
private $inited;
public function __construct($baseURI, $token, bool $verifySSL = true)
{
$this->baseURI = $baseURI;
$parts = parse_url($baseURI);
$options = [
'base_uri' => $baseURI,
'cookies' => true,
'headers' => [
'Authorization' => "Bearer {$token}",
// TODO: is this a good idea, or hacky security
// risk..? without it, can get error response: 400
// Client Error: Bad CSRF Origin for url
'Origin' => "{$parts['scheme']}://{$parts['host']}",
],
'verify' => $verifySSL,
];
$this->httpClient = new \GuzzleHttp\Client($options);
$this->inited = false;
}
private function init()
{
if ($this->inited) {
return;
}
// fetch 'session' endpoint, to get current xsrf token
$response = $this->get('/session');
// look for xsrf token cookie
$jar = $this->httpClient->getConfig('cookies');
foreach ($jar->toArray() as $cookie) {
// and save it when found
if ($cookie['Name'] == 'XSRF-TOKEN') {
$this->xsrfToken = $cookie['Value'];
$this->inited = true;
break;
}
}
}
public function get(string $uri = '', array $options = []): ResponseInterface
{
$uri = $this->baseURI . $uri;
return $this->httpClient->request('GET', $uri, $options);
}
public function post(string $uri = '', array $data = []): ResponseInterface
{
$this->init();
$uri = $this->baseURI . $uri;
$options = [
'headers' => ['X-XSRF-TOKEN' => $this->xsrfToken],
'json' => $data,
];
return $this->httpClient->request('POST', $uri, $options);
}
}