container->setBindings(RequestInterface::class, Constrict\Request::class); $this->container->setBindings(ResponseInterface::class, Constrict\Response::class); $exceptionHandler = Config::get('exception.http', ExceptionHandlerDispatcher::class); if (!in_array(ExceptionHandlerInterface::class, class_implements($exceptionHandler))) { $exceptionHandler = ExceptionHandlerDispatcher::class; } $this->exceptionHandler = $this->container->get($exceptionHandler); $this->responseEmitter = $this->container->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 Message\Response()); $PsrRequest = Context::setContext(RequestInterface::class, ServerRequest::createServerRequest($request)); if ($PsrRequest->isMethod('OPTIONS')) { $request->server['request_uri'] = '/*'; } return [$PsrRequest, $PsrResponse]; } }