Files
kiri-router/src/SwooleHttpResponseEmitter.php
T
2023-11-04 00:57:06 +08:00

115 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Kiri\Router;
use Kiri\Di\Inject\Container;
use Kiri\Di\Interface\ResponseEmitterInterface;
use Kiri\Events\EventDispatch;
use Kiri\Events\EventProvider;
use Kiri\Server\Events\OnAfterRequest;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\Http\Message\ResponseInterface;
use ReflectionException;
use SplPriorityQueue;
/**
* Swoole Http Response Emitter
*/
class SwooleHttpResponseEmitter implements ResponseEmitterInterface
{
/**
* @var EventProvider
*/
#[Container(EventProvider::class)]
public EventProvider $provider;
/**
* @var EventDispatch
*/
#[Container(EventDispatch::class)]
public EventDispatch $dispatch;
/**
* @var SplPriorityQueue
*/
protected SplPriorityQueue $events;
/**
* @var OnAfterRequest
*/
protected OnAfterRequest $afterRequest;
/**
* @return void
*/
public function init(): void
{
$this->afterRequest = new OnAfterRequest();
$this->events = $this->provider->getListenersForEvent($this->afterRequest);
}
/**
* @param Response $proxy
* @param object $response
* @param object $request
* @return void
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws ReflectionException
*/
public function xxxxxxxxxxxxxxxxxxxxxxxxxSender(ResponseInterface $proxy, object $response, object $request): void
{
// TODO: Implement sender() method.
$this->writeParams($proxy, $response, $request);
$proxy->end($response);
$this->dispatch->execute($this->events, $this->afterRequest);
}
/**
* @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();
if (count($headers) > 0) foreach ($headers as $name => $header) {
$response->header($name, $header);
}
$cookieParams = $proxy->getCookieParams();
if (count($cookieParams) > 0) foreach ($cookieParams as $cookie) {
$response->setCookie(...$cookie);
}
$response->header('Run-Time', $this->getRunTime($request));
$response->header('Server', 'swoole');
$response->header('Swoole-Version', \swoole_version());
}
/**
* @param object $request
* @return float
*/
protected function getRunTime(object $request): float
{
return microtime(true) - +$request->getServerParam('request_time_float');
}
}