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/
|
||||
|
|
|
@ -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
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