diff --git a/http-core/Server.php b/http-core/Server.php new file mode 100644 index 00000000..a96cb51c --- /dev/null +++ b/http-core/Server.php @@ -0,0 +1,123 @@ +exceptionHandler = Kiri::getDi()->get($exceptionHandler); + $this->responseEmitter = Kiri::getDi()->get(ResponseEmitter::class); + } + + + /** + * @param Request $request + * @param Response $response + * @throws Exception + */ + public function onRequest(Request $request, Response $response): void + { + try { + [$PsrRequest, $PsrResponse] = $this->initRequestResponse($request); + /** @var Handler $handler */ + $handler = HandlerManager::get($request->server['request_uri'], $request->getMethod()); + if (is_integer($handler)) { + $PsrResponse->withStatus($handler)->withBody(new Stream('Allow Method[' . $request->getMethod() . '].')); + } else if (is_null($handler)) { + $PsrResponse->withStatus(404)->withBody(new Stream('Page not found.')); + } else { + $PsrResponse = $this->handler($handler, $PsrRequest); + } + } catch (\Throwable $throwable) { + $PsrResponse = $this->exceptionHandler->emit($throwable, $this->response); + } finally { + $this->responseEmitter->sender($response, $PsrResponse); + $this->eventDispatch->dispatch(new OnAfterRequest()); + } + } + + + /** + * @param Handler $handler + * @param $PsrRequest + * @return ResponseInterface + * @throws Exception + */ + protected function handler(Handler $handler, $PsrRequest): \Psr\Http\Message\ResponseInterface + { + $dispatcher = new Dispatcher($handler, $handler->_middlewares); + return $dispatcher->handle($PsrRequest); + } + + + /** + * @param Request $request + * @return array + * @throws Exception + */ + private function initRequestResponse(Request $request): array + { + $PsrResponse = Context::setContext(ResponseInterface::class, new \Http\Message\Response()); + + $PsrRequest = Context::setContext(RequestInterface::class, ServerRequest::createServerRequest($request)); + if ($PsrRequest->isMethod('OPTIONS')) { + $request->server['request_uri'] = '/*'; + } + return [$PsrRequest, $PsrResponse]; + } + + +}