91 lines
2.4 KiB
PHP
91 lines
2.4 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace SparkPlug\Com\Noccy\ApiClient\Request;
|
||
|
|
||
|
use GuzzleHttp\Client;
|
||
|
use GuzzleHttp\Psr7\Response;
|
||
|
|
||
|
class HttpRequest extends Request
|
||
|
{
|
||
|
|
||
|
private string $method = 'GET';
|
||
|
|
||
|
private string $version = '1.1';
|
||
|
|
||
|
private ?string $url = null;
|
||
|
|
||
|
private array $query = [];
|
||
|
|
||
|
private array $headers = [];
|
||
|
|
||
|
public function __construct(array $props)
|
||
|
{
|
||
|
foreach ($props as $prop=>$value) {
|
||
|
|
||
|
if (str_starts_with($prop, 'http.')) {
|
||
|
$this->handleHttpProp(substr($prop,5), $value);
|
||
|
} elseif ($prop == 'url') {
|
||
|
$this->url = $value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private function handleHttpProp(string $prop, $value)
|
||
|
{
|
||
|
|
||
|
if (str_starts_with($prop, 'query.')) {
|
||
|
$this->query[substr($prop, 6)] = $value;
|
||
|
} elseif (str_starts_with($prop, 'header.')) {
|
||
|
$this->headers[substr($prop, 7)] = $value;
|
||
|
} elseif ($prop === 'method') {
|
||
|
$this->method = strtoupper($value);
|
||
|
} elseif ($prop === 'version') {
|
||
|
$this->version = $value;
|
||
|
} else {
|
||
|
fprintf(STDERR, "Warning: unhandled prop: http.%s (%s)\n", $prop, $value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function getInfo(): array
|
||
|
{
|
||
|
$query = http_build_query($this->query);
|
||
|
$headers = [];
|
||
|
foreach ($this->headers as $k=>$v) {
|
||
|
// Convert to Proper-Case unless UPPERCASE
|
||
|
if ($k !== strtoupper($k))
|
||
|
$k = ucwords($k, '-');
|
||
|
// Build the header
|
||
|
$headers[] = sprintf("<options=bold>%s</>: %s", $k, $v);
|
||
|
}
|
||
|
return [
|
||
|
'protocol' => sprintf("HTTP/%s %s", $this->version, $this->method),
|
||
|
'query' => $this->url . "?" . $query,
|
||
|
'body' => "Empty body"
|
||
|
];
|
||
|
}
|
||
|
|
||
|
public function getHeaders(): array
|
||
|
{
|
||
|
$headers = [];
|
||
|
foreach ($this->headers as $k=>$v) {
|
||
|
// Convert to Proper-Case unless UPPERCASE
|
||
|
if ($k !== strtoupper($k))
|
||
|
$k = ucwords($k, '-');
|
||
|
// Build the header
|
||
|
$headers[$k] = (array)$v;
|
||
|
}
|
||
|
return $headers;
|
||
|
}
|
||
|
|
||
|
public function send(): ?Response
|
||
|
{
|
||
|
$query = http_build_query($this->query);
|
||
|
$url = $this->url . ($query?'?'.$query:'');
|
||
|
$config = [];
|
||
|
$client = new Client($config);
|
||
|
$options = [];
|
||
|
$response = $client->request($this->method, $url, $options);
|
||
|
return $response;
|
||
|
}
|
||
|
|
||
|
}
|