2023-04-15 23:29:27 +08:00
|
|
|
<?php
|
2023-04-16 01:24:30 +08:00
|
|
|
declare(strict_types=1);
|
2023-04-15 23:29:27 +08:00
|
|
|
|
|
|
|
|
namespace Kiri\Router;
|
|
|
|
|
|
2023-10-17 21:18:52 +08:00
|
|
|
use Kiri\Di\Inject\Container;
|
2023-04-24 10:54:56 +08:00
|
|
|
use Kiri\Di\Interface\ResponseEmitterInterface;
|
2023-10-17 21:18:52 +08:00
|
|
|
use Kiri\Events\EventDispatch;
|
|
|
|
|
use Kiri\Events\EventProvider;
|
2023-08-16 01:01:47 +08:00
|
|
|
use Kiri\Server\Events\OnAfterRequest;
|
|
|
|
|
use Psr\Container\ContainerExceptionInterface;
|
|
|
|
|
use Psr\Container\NotFoundExceptionInterface;
|
2023-04-15 23:31:16 +08:00
|
|
|
use Psr\Http\Message\ResponseInterface;
|
2023-08-16 01:01:47 +08:00
|
|
|
use ReflectionException;
|
2023-10-17 21:18:52 +08:00
|
|
|
use SplPriorityQueue;
|
2023-04-15 23:31:16 +08:00
|
|
|
|
|
|
|
|
|
2023-10-17 16:25:29 +08:00
|
|
|
/**
|
|
|
|
|
* Swoole Http Response Emitter
|
|
|
|
|
*/
|
2023-04-24 14:23:24 +08:00
|
|
|
class SwooleHttpResponseEmitter implements ResponseEmitterInterface
|
2023-04-15 23:29:27 +08:00
|
|
|
{
|
|
|
|
|
|
2023-10-17 21:18:52 +08:00
|
|
|
/**
|
|
|
|
|
* @var SplPriorityQueue
|
|
|
|
|
*/
|
|
|
|
|
protected SplPriorityQueue $events;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var OnAfterRequest
|
|
|
|
|
*/
|
|
|
|
|
protected OnAfterRequest $afterRequest;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2023-11-22 17:16:10 +08:00
|
|
|
* @param EventDispatch $dispatch
|
|
|
|
|
* @param EventProvider $provider
|
2023-10-17 21:18:52 +08:00
|
|
|
*/
|
2023-11-22 17:16:10 +08:00
|
|
|
public function __construct(readonly public EventDispatch $dispatch, readonly public EventProvider $provider)
|
2023-10-17 21:18:52 +08:00
|
|
|
{
|
|
|
|
|
$this->afterRequest = new OnAfterRequest();
|
|
|
|
|
$this->events = $this->provider->getListenersForEvent($this->afterRequest);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-08-16 01:01:47 +08:00
|
|
|
/**
|
|
|
|
|
* @param Response $proxy
|
|
|
|
|
* @param object $response
|
2023-10-17 14:50:46 +08:00
|
|
|
* @param object $request
|
2023-08-16 01:01:47 +08:00
|
|
|
* @return void
|
|
|
|
|
* @throws ContainerExceptionInterface
|
|
|
|
|
* @throws NotFoundExceptionInterface
|
|
|
|
|
* @throws ReflectionException
|
|
|
|
|
*/
|
2023-11-22 09:26:18 +08:00
|
|
|
public function response(ResponseInterface $proxy, object $response, object $request): void
|
2023-10-17 14:50:46 +08:00
|
|
|
{
|
|
|
|
|
// TODO: Implement sender() method.
|
|
|
|
|
$this->writeParams($proxy, $response, $request);
|
2023-04-15 23:31:16 +08:00
|
|
|
|
2023-10-17 14:50:46 +08:00
|
|
|
$proxy->end($response);
|
2023-08-16 01:01:47 +08:00
|
|
|
|
2023-10-17 21:18:52 +08:00
|
|
|
$this->dispatch->execute($this->events, $this->afterRequest);
|
2023-08-16 01:01:47 +08:00
|
|
|
}
|
2023-04-15 23:31:16 +08:00
|
|
|
|
|
|
|
|
|
2023-10-17 14:50:46 +08:00
|
|
|
/**
|
|
|
|
|
* @param Response $proxy
|
|
|
|
|
* @param object $response
|
|
|
|
|
* @param object $request
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
private function writeParams(ResponseInterface $proxy, object $response, object $request): void
|
|
|
|
|
{
|
|
|
|
|
$response->setStatusCode($proxy->getStatusCode());
|
|
|
|
|
$headers = $proxy->getHeaders();
|
2023-10-17 16:24:11 +08:00
|
|
|
if (count($headers) > 0) foreach ($headers as $name => $header) {
|
|
|
|
|
$response->header($name, $header);
|
2023-10-17 14:50:46 +08:00
|
|
|
}
|
|
|
|
|
$cookieParams = $proxy->getCookieParams();
|
2023-10-17 16:24:11 +08:00
|
|
|
if (count($cookieParams) > 0) foreach ($cookieParams as $cookie) {
|
|
|
|
|
$response->setCookie(...$cookie);
|
2023-10-17 14:50:46 +08:00
|
|
|
}
|
|
|
|
|
$response->header('Run-Time', $this->getRunTime($request));
|
|
|
|
|
$response->header('Server', 'swoole');
|
2023-10-18 10:58:24 +08:00
|
|
|
$response->header('Swoole-Version', \swoole_version());
|
2023-10-17 14:50:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param object $request
|
|
|
|
|
* @return float
|
|
|
|
|
*/
|
|
|
|
|
protected function getRunTime(object $request): float
|
|
|
|
|
{
|
|
|
|
|
return microtime(true) - +$request->getServerParam('request_time_float');
|
|
|
|
|
}
|
2023-04-15 23:31:16 +08:00
|
|
|
|
|
|
|
|
|
2023-04-15 23:29:27 +08:00
|
|
|
}
|