router = Snowflake::app()->getRouter(); } /** * @param Request $request * @param Response $response * @return void * @throws Exception */ public function onHandler(Request $request, Response $response): mixed { try { Coroutine::defer(function () { fire(Event::SYSTEM_RESOURCE_RELEASES); }); /** @var HResponse $response */ [$request, $response] = OnRequest::createContext($request, $response); if ($request->is('favicon.ico')) { return $response->close(404); } return $this->router->dispatch(); } catch (ExitException | Error | \Throwable $exception) { $this->addError($exception, 'throwable'); return $this->sendErrorMessage($request, $response, $exception); } } /** * @param $request * @param $response * @return array */ public static function createContext($request, $response): array { return [HRequest::create($request), HResponse::create($response)]; } /** * @param $sRequest * @param $sResponse * @param $exception * @return bool|string * @throws Exception */ protected function sendErrorMessage($sRequest, $sResponse, $exception): bool|string { $this->addError($exception, 'throwable'); if ($sResponse instanceof Response) { [$sRequest, $sResponse] = [HRequest::create($sRequest), HResponse::create($sResponse)]; } $headers = $sRequest->headers->get('access-control-request-headers'); $methods = $sRequest->headers->get('access-control-request-method'); $sResponse->addHeader('Access-Control-Allow-Origin', '*'); $sResponse->addHeader('Access-Control-Allow-Headers', $headers); $sResponse->addHeader('Access-Control-Request-Method', $methods); if (!($exception instanceof ExitException)) { return $sResponse->send(\logger()->exception($exception), 200); } else { return $sResponse->send($exception->getMessage(), 200); } } }