is('favicon.ico')) { return $sResponse->send($sRequest->isNotFound(), 200); } $node = Snowflake::app()->router->dispatch(); if (!($node instanceof Node)) { return $sResponse->send($node, 200); } $sResponse->send($content = $node->dispatch(), 200); if ($node->hasAfter()) { $node->afterDispatch($content); } } catch (Error | \Throwable $exception) { $this->sendErrorMessage($sResponse ?? null, $exception, $response); } finally { $events = Snowflake::app()->getEvent(); if (!$events->exists(Event::EVENT_AFTER_REQUEST)) { return; } $events->trigger(Event::EVENT_AFTER_REQUEST, [$request]); } } /** * @param $sResponse * @param $exception * @param $response * @throws Exception */ protected function sendErrorMessage($sResponse, $exception, $response) { if (empty($sResponse)) { $response->status(200); $response->end($exception->getMessage()); } else { $sResponse->send($this->format($exception), 200); } } /** * @param Exception $exception * @return false|int|mixed|string * @throws Exception */ public function format($exception) { $errorInfo = [ 'message' => $exception->getMessage(), 'file' => $exception->getFile(), 'line' => $exception->getLine() ]; $this->error(var_export($errorInfo, true)); $code = $exception->getCode() ?? 500; $logger = Snowflake::app()->logger; $string = 'Exception: ' . PHP_EOL; $string .= '#. message: ' . $errorInfo['message'] . PHP_EOL; $string .= '#. file: ' . $errorInfo['file'] . PHP_EOL; $string .= '#. line: ' . $errorInfo['line'] . PHP_EOL; $logger->write($string . $exception->getTraceAsString(), 'trace'); $logger->write(jTraceEx($exception), 'exception'); return JSON::to($code, $errorInfo['message']); } /** * @param $request * @param $response * @return array * @throws Exception */ public static function setContext($request, $response): array { $request = Context::setContext('request', HRequest::create($request)); $response = Context::setContext('response', HResponse::create($response)); return [$request, $response]; } }