Add basic HTTP client for Tailbone API
with inspiration from https://packagist.org/packages/avency/gitea
This commit is contained in:
parent
272fd5f72b
commit
64f4ea89be
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1 +1,2 @@
|
||||||
|
composer.lock
|
||||||
/vendor/
|
/vendor/
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "rattail/posterior",
|
"name": "rattail/posterior",
|
||||||
"description": "Tailbone API Client",
|
"description": "Tailbone API Client",
|
||||||
|
"type": "library",
|
||||||
"homepage": "https://rattailproject.org",
|
"homepage": "https://rattailproject.org",
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "GPL-3.0-or-later",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
@ -14,5 +15,7 @@
|
||||||
"email": "lance@edbob.org"
|
"email": "lance@edbob.org"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require": {}
|
"require": {
|
||||||
|
"guzzlehttp/guzzle": "^7.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
75
src/Client.php
Normal file
75
src/Client.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue