uiharu/src/UihContext.php

96 lines
2.6 KiB
PHP

<?php
namespace Uiharu;
use Index\Data\IDbConnection;
use Index\Http\HttpFx;
final class UihContext {
private IDbConnection $database;
private HttpFx $router;
private array $apis = [];
private array $lookups = [];
public function __construct(IDbConnection $database) {
$this->database = $database;
}
public function getDatabase(): IDbConnection {
return $this->database;
}
public function getRouter(): HttpFx {
return $this->router;
}
public function isOriginAllowed(string $origin): bool {
$origin = mb_strtolower(parse_url($origin, PHP_URL_HOST));
if($origin === $_SERVER['HTTP_HOST'])
return true;
$allowed = Config::get('CORS', 'origins', []);
if(empty($allowed))
return true;
return in_array($origin, $allowed);
}
public function setupHttp(): void {
$this->router = new HttpFx;
$this->router->use('/', function($response) {
$response->setPoweredBy('Uiharu');
});
$this->router->use('/', function($response, $request) {
$origin = $request->getHeaderLine('Origin');
if(!empty($origin)) {
if(!$this->isOriginAllowed($origin))
return 403;
$response->setHeader('Access-Control-Allow-Origin', $origin);
$response->setHeader('Vary', 'Origin');
}
});
$this->router->use('/', function($response, $request) {
if($request->getMethod() === 'OPTIONS') {
$response->setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET, POST');
return 204;
}
});
$this->router->get('/', function($response) {
$response->accelRedirect('/index.html');
$response->setContentType('text/html; charset=utf-8');
});
}
public function dispatchHttp(...$args): void {
$this->router->dispatch(...$args);
}
public function registerApi(IApi $api): void {
$this->apis[] = $api;
}
public function matchApi(string $reqPath): void {
$reqPath = '/' . trim(parse_url($reqPath, PHP_URL_PATH), '/');
foreach($this->apis as $api)
if($api->match($reqPath)) {
$api->register($this->router);
break;
}
}
public function registerLookup(ILookup $lookup): void {
$this->lookups[] = $lookup;
}
public function matchLookup(Url $url): ?ILookup {
foreach($this->lookups as $lookup)
if($lookup->match($url))
return $lookup;
return null;
}
}