diff --git a/HttpServer/Events/OnClose.php b/HttpServer/Events/OnClose.php index c1c9fc20..d2b4e9bb 100644 --- a/HttpServer/Events/OnClose.php +++ b/HttpServer/Events/OnClose.php @@ -6,10 +6,13 @@ namespace HttpServer\Events; use Annotation\Route\Socket; use HttpServer\Abstracts\Callback; +use HttpServer\Http\Request; use HttpServer\Route\Node; use Snowflake\Abstracts\Config; use Snowflake\Event; use Snowflake\Exception\ComponentException; +use Snowflake\Exception\ConfigException; +use Snowflake\Exception\NotFindClassException; use Snowflake\Snowflake; use Swoole\Coroutine; use Swoole\Server; @@ -46,20 +49,7 @@ class OnClose extends Callback private function execute(Server $server, int $fd): void { try { - $router = Snowflake::app()->getRouter(); - if (!($server instanceof WServer) || !$server->isEstablished($fd)) { - return; - } - - $context = Config::get('router', false, ROUTER_TREE); - if ($context === ROUTER_TREE) { - $node = $router->tree_search(explode('/', Socket::CLOSE . '::event'), 'sw::socket'); - } else { - $node = $router->search('/' . Socket::CLOSE . '::event', 'sw::socket'); - } - if ($node instanceof Node) { - $node->dispatch($server, $fd); - } + $this->loadNode($server, $fd); } catch (\Throwable $exception) { $this->addError($exception); } finally { @@ -67,4 +57,23 @@ class OnClose extends Callback $logger->insert(); } } + + + /** + * @param $server + * @param $fd + * @return mixed + * @throws ComponentException + * @throws ConfigException + * @throws NotFindClassException + * @throws Exception + */ + private function loadNode($server, $fd): mixed + { + $query = Request::socketQuery((object)['fd' => $fd], Socket::CLOSE); + if (($node = router()->find_path($query)) !== null) { + return $node->dispatch($server, $fd); + } + return null; + } } diff --git a/HttpServer/Events/OnMessage.php b/HttpServer/Events/OnMessage.php index 4008d9c6..16ab3623 100644 --- a/HttpServer/Events/OnMessage.php +++ b/HttpServer/Events/OnMessage.php @@ -8,10 +8,16 @@ use Annotation\Route\Socket; use Exception; use HttpServer\Abstracts\Callback; use HttpServer\Http\Context; +use HttpServer\Http\HttpHeaders; +use HttpServer\Http\HttpParams; +use HttpServer\Http\Request; +use ReflectionException; use Snowflake\Abstracts\Config; use Snowflake\Core\Json; use Snowflake\Event; use Snowflake\Exception\ComponentException; +use Snowflake\Exception\ConfigException; +use Snowflake\Exception\NotFindClassException; use Snowflake\Snowflake; use Swoole\Coroutine; use Swoole\WebSocket\Frame; @@ -52,32 +58,43 @@ class OnMessage extends Callback /** * @param $event - * @param $frame + * @param Frame $frame * @param $server * @return mixed * @throws Exception */ - private function resolve($event, $frame, $server): mixed + private function resolve($event, Frame $frame, $server): mixed { if ($event->exists(Event::SERVER_MESSAGE)) { $event->trigger(Event::SERVER_MESSAGE, [$server, $frame]); } else { $frame->data = json_decode($frame->data, true); } - if (empty($route = $frame->data['route'] ?? null)) { - throw new Exception('Format error.'); + if (!empty($route = $frame->data['route'] ?? null)) { + return $this->loadNode($frame, $route, $server); } - $router = Snowflake::app()->getRouter(); - $context = Config::get('router', false, ROUTER_TREE); - if ($context === ROUTER_TREE) { - $node = $router->tree_search(explode('/', Socket::MESSAGE . '::' . $route), 'sw::socket'); - } else { - $node = $router->search('/' . Socket::MESSAGE . '::' . $route, 'sw::socket'); + return null; + } + + + /** + * @param $frame + * @param $route + * @param $server + * @return mixed + * @throws ComponentException + * @throws ReflectionException + * @throws ConfigException + * @throws NotFindClassException + * @throws Exception + */ + private function loadNode($frame, $route, $server): mixed + { + $query = Request::socketQuery($frame, Socket::MESSAGE, $route); + if (($node = router()->find_path($query)) !== null) { + return $node->dispatch($frame, $server); } - if ($node === null) { - throw new Exception('Page not found.'); - } - return $node->dispatch($frame, $server); + return null; } } diff --git a/HttpServer/Http/Request.php b/HttpServer/Http/Request.php index 386cbadc..2547a43b 100644 --- a/HttpServer/Http/Request.php +++ b/HttpServer/Http/Request.php @@ -3,6 +3,7 @@ declare(strict_types=1); namespace HttpServer\Http; +use Annotation\Route\Socket; use Exception; use HttpServer\Abstracts\HttpService; use HttpServer\IInterface\AuthIdentity; @@ -456,4 +457,29 @@ class Request extends HttpService } + /** + * @param $frame + * @param $route + * @param string $event + * @return Request + * @throws NotFindClassException + * @throws ReflectionException + */ + public static function socketQuery($frame, $event = Socket::MESSAGE, $route = 'event'): Request + { + /** @var Request $sRequest */ + $sRequest = Snowflake::createObject(Request::class); + $sRequest->fd = $frame->fd; + $sRequest->startTime = microtime(true); + + $sRequest->params = new HttpParams([], [], []); + $sRequest->headers = new HttpHeaders([]); + $sRequest->headers->replace('request_method', 'sw::socket'); + $sRequest->headers->replace('request_uri', $event . '::' . $route); + $sRequest->parseUri(); + + return $sRequest; + } + + }