This commit is contained in:
2023-04-15 23:31:16 +08:00
parent 2d9ac93a7a
commit 41a53200b3
69 changed files with 1678 additions and 749 deletions
+29 -64
View File
@@ -1,35 +1,25 @@
<?php
namespace Kiri\Message;
namespace Kiri\Router;
use Exception;
use Kiri;
use Kiri\Abstracts\AbstractServer;
use Kiri\Abstracts\Config;
use Kiri\Abstracts\CoordinatorManager;
use Kiri\Coordinator;
use Kiri\Di\ContainerInterface;
use Kiri\Di\Context;
use Kiri\Events\EventProvider;
use Kiri\Exception\ConfigException;
use Kiri\Message\Abstracts\ExceptionHandlerInterface;
use Kiri\Message\Abstracts\ResponseHelper;
use Kiri\Message\Constrict\RequestInterface;
use Kiri\Message\Constrict\ResponseInterface;
use Kiri\Message\Handler\DataGrip;
use Kiri\Message\Handler\Dispatcher;
use Kiri\Message\Handler\RouterCollector;
use Kiri\Message\Response as Psr7Response;
use Kiri\Server\Events\OnAfterWorkerStart;
use Kiri\Server\Events\OnBeforeWorkerStart;
use Kiri\Router\Interface\ExceptionHandlerInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\Http\Message\ResponseInterface as PsrResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Swoole\Http\Request;
use Swoole\Http\Response;
use Kiri\Router\Constrict\Response as KrcResponse;
use Kiri\Router\Constrict\Uri;
use Kiri\Router\Interface\OnRequestInterface;
use Kiri\Router\Base\ExceptionHandlerDispatcher;
/**
@@ -38,8 +28,6 @@ use Swoole\Http\Response;
class Server extends AbstractServer implements OnRequestInterface
{
use ResponseHelper;
public RouterCollector $router;
@@ -48,25 +36,21 @@ class Server extends AbstractServer implements OnRequestInterface
*/
public ExceptionHandlerInterface $exception;
private ContentType $contentType;
public Emitter $emitter;
/**
* @var HttpResponseEmitter
*/
public HttpResponseEmitter $emitter;
/**
* @param ContainerInterface $container
* @param Dispatcher $dispatcher
* @param EventProvider $provider
* @param DataGrip $dataGrip
* @param array $config
* @throws Exception
*/
public function __construct(
public ContainerInterface $container,
public Dispatcher $dispatcher,
public EventProvider $provider,
public DataGrip $dataGrip,
array $config = [])
{
parent::__construct($config);
@@ -80,37 +64,15 @@ class Server extends AbstractServer implements OnRequestInterface
*/
public function init()
{
$this->emitter = $this->container->get(Emitter::class);
$this->emitter = $this->container->get(HttpResponseEmitter::class);
$exception = Config::get('exception.http', ExceptionHandlerDispatcher::class);
$exception = Kiri::service()->get('request')->exception;
if (!in_array(ExceptionHandlerInterface::class, class_implements($exception))) {
$exception = ExceptionHandlerDispatcher::class;
}
$this->exception = $this->container->get($exception);
$this->provider->on(OnBeforeWorkerStart::class, [$this, 'onStartWaite']);
$this->provider->on(OnAfterWorkerStart::class, [$this, 'onEndWaite']);
$this->contentType = Config::get('response.format', ContentType::JSON);
$this->router = $this->dataGrip->get('http');
}
/**
* @return void
*/
public function onStartWaite(): void
{
CoordinatorManager::utility(Coordinator::WORKER_START)->waite();
}
/**
* @return void
*/
public function onEndWaite(): void
{
CoordinatorManager::utility(Coordinator::WORKER_START)->done();
$this->router = $this->container->get(DataGrip::class)->get(ROUTER_TYPE_HTTP);
}
@@ -127,30 +89,33 @@ class Server extends AbstractServer implements OnRequestInterface
$dispatcher = $this->router->query($request->server['request_uri'], $request->getMethod());
$PsrResponse = $dispatcher->dispatch->recover($PsrRequest);
$PsrResponse = (new HttpRequestHandler([], $dispatcher))->handle($PsrRequest);
} catch (\Throwable $throwable) {
$this->logger->error($throwable->getMessage(), [$throwable]);
$PsrResponse = $this->exception->emit($throwable, di(Constrict\Response::class));
} finally {
$this->emitter->sender($response, $PsrResponse);
$this->emitter->sender($PsrResponse, $response);
}
}
/**
* @param Request $request
* @return RequestInterface
* @throws Exception
*/
private function initRequestAndResponse(Request $request): \Psr\Http\Message\RequestInterface
private function initRequestAndResponse(Request $request): RequestInterface
{
/** @var ResponseInterface $PsrResponse */
$PsrResponse = Context::set(ResponseInterface::class, new Psr7Response());
$PsrResponse->withContentType($this->contentType);
/** @var \Kiri\Router\Response $response */
$response = Kiri::service()->get('response');
$serverRequest = (new ServerRequest())->withData($request->getContent())
->withServerParams($request->server)
->withServerTarget($request)
/** @var KrcResponse $PsrResponse */
$PsrResponse = Context::set(ResponseInterface::class, new KrcResponse());
$PsrResponse->withContentType($response->contentType);
$serverRequest = (new ServerRequest())->withHeaders($request->getData())
->withUri(Uri::parse($request))
->withProtocolVersion($request->server['server_protocol'])
->withCookieParams($request->cookie ?? [])
->withQueryParams($request->get)
->withUploadedFiles($request->files)