94 lines
2.2 KiB
PHP
94 lines
2.2 KiB
PHP
<?php namespace MapGuesser\Http;
|
|
|
|
class Request
|
|
{
|
|
const HTTP_GET = 0;
|
|
|
|
const HTTP_POST = 1;
|
|
|
|
private string $url;
|
|
|
|
private int $method;
|
|
|
|
private string $query = '';
|
|
|
|
private array $headers = [];
|
|
|
|
public function __construct(string $url, int $method = self::HTTP_GET)
|
|
{
|
|
$this->url = $url;
|
|
$this->method = $method;
|
|
}
|
|
|
|
public function setQuery($query)
|
|
{
|
|
if (is_string($query)) {
|
|
$this->query = $query;
|
|
} else {
|
|
$this->query = http_build_query($query);
|
|
}
|
|
}
|
|
|
|
public function setHeaders(array $headers)
|
|
{
|
|
$this->headers = array_merge($this->headers, $headers);
|
|
}
|
|
|
|
public function send(): Response
|
|
{
|
|
$ch = curl_init();
|
|
|
|
if ($this->method === self::HTTP_GET) {
|
|
$url = $this->url . '?' . $this->query;
|
|
} elseif ($this->method === self::HTTP_POST) {
|
|
$url = $this->url;
|
|
|
|
curl_setopt($ch, CURLOPT_POST, 1);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->query);
|
|
}
|
|
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
|
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
|
|
curl_setopt($ch, CURLOPT_USERAGENT, 'MapGuesser cURL/1.0');
|
|
|
|
if (count($this->headers) > 0) {
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
|
|
}
|
|
|
|
$responseHeaders = [];
|
|
curl_setopt(
|
|
$ch,
|
|
CURLOPT_HEADERFUNCTION,
|
|
function ($ch, $header) use (&$responseHeaders) {
|
|
$len = strlen($header);
|
|
$header = explode(':', $header, 2);
|
|
|
|
if (count($header) < 2) {
|
|
return $len;
|
|
}
|
|
|
|
$responseHeaders[strtolower(trim($header[0]))][] = trim($header[1]);
|
|
|
|
return $len;
|
|
}
|
|
);
|
|
|
|
$responseBody = curl_exec($ch);
|
|
|
|
if ($responseBody === false) {
|
|
$error = curl_error($ch);
|
|
|
|
curl_close($ch);
|
|
|
|
throw new \Exception($error);
|
|
}
|
|
|
|
curl_close($ch);
|
|
|
|
return new Response($responseBody, $responseHeaders);
|
|
}
|
|
}
|