diff --git a/Server/Abstracts/EventDispatchHelper.php b/Server/Abstracts/EventDispatchHelper.php new file mode 100644 index 00000000..2852a277 --- /dev/null +++ b/Server/Abstracts/EventDispatchHelper.php @@ -0,0 +1,16 @@ +exceptionHandler = Kiri::getDi()->get($exceptionHandler); + } + +} diff --git a/Server/Abstracts/ResponseHelper.php b/Server/Abstracts/ResponseHelper.php new file mode 100644 index 00000000..76a2b93e --- /dev/null +++ b/Server/Abstracts/ResponseHelper.php @@ -0,0 +1,26 @@ +exceptionHandler = Kiri::getDi()->get($exceptionHandler); + } + +} diff --git a/Server/Abstracts/Udp.php b/Server/Abstracts/Udp.php new file mode 100644 index 00000000..46ff6df2 --- /dev/null +++ b/Server/Abstracts/Udp.php @@ -0,0 +1,43 @@ +exceptionHandler = Kiri::getDi()->get($exceptionHandler); + } + +} diff --git a/Server/Abstracts/Websocket.php b/Server/Abstracts/Websocket.php new file mode 100644 index 00000000..9d5e302c --- /dev/null +++ b/Server/Abstracts/Websocket.php @@ -0,0 +1,83 @@ +exceptionHandler = Kiri::getDi()->get($exceptionHandler); + } + + + + /** + * @param Request $request + * @param Response $response + * @throws Exception + */ + public function onHandshake(Request $request, Response $response): void + { + // TODO: Implement OnHandshake() method. + /** @var \Swoole\WebSocket\Server $server */ + $secWebSocketKey = $request->header['sec-websocket-key']; + $patten = '#^[+/0-9A-Za-z]{21}[AQgw]==$#'; + if (0 === preg_match($patten, $secWebSocketKey) || 16 !== strlen(base64_decode($secWebSocketKey))) { + throw new Exception('protocol error.', 500); + } + $key = base64_encode(sha1($request->header['sec-websocket-key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', TRUE)); + $headers = [ + 'Upgrade' => 'websocket', + 'Connection' => 'Upgrade', + 'Sec-websocket-Accept' => $key, + 'Sec-websocket-Version' => '13', + ]; + if (isset($request->header['sec-websocket-protocol'])) { + $headers['Sec-websocket-Protocol'] = $request->header['sec-websocket-protocol']; + } + foreach ($headers as $key => $val) { + $response->setHeader($key, $val); + } + } + + +} diff --git a/Server/ListenerHelper.php b/Server/ListenerHelper.php index d87f6e69..31d2d01c 100644 --- a/Server/ListenerHelper.php +++ b/Server/ListenerHelper.php @@ -22,7 +22,6 @@ trait ListenerHelper * @param array $events * @param array|Closure $default * @return mixed - * @throws NotFindClassException * @throws ReflectionException */ protected static function callback(string $name, array $events, array|Closure $default): mixed diff --git a/Server/SInterface/OnClose.php b/Server/SInterface/OnClose.php new file mode 100644 index 00000000..751bf17a --- /dev/null +++ b/Server/SInterface/OnClose.php @@ -0,0 +1,29 @@ +ports[$port]->set($settings['settings'] ?? []); - $reflect = match ($type) { - Constant::SERVER_TYPE_TCP => Kiri::getDi()->newObject(TCPServerListener::class), - Constant::SERVER_TYPE_UDP => Kiri::getDi()->newObject(UDPServerListener::class), - Constant::SERVER_TYPE_HTTP => Kiri::getDi()->newObject(HTTPServerListener::class), - Constant::SERVER_TYPE_WEBSOCKET => Kiri::getDi()->newObject(WebSocketServerListener::class), - default => throw new Exception(''), - }; - $reflect->bindCallback($this->ports[$port], $settings['events'] ?? []); + $this->addServiceEvents($settings['events'] ?? [], $this->ports[$port]); } @@ -335,22 +328,23 @@ class ServerManager extends Abstracts\Server if (($this->server->setting['task_worker_num'] ?? 0) > 0) { $this->addTaskListener($settings['events']); } - if ($type === Constant::SERVER_TYPE_WEBSOCKET) { - /** @var WebSocketServerListener $reflect */ - $reflect = $this->getNewInstance(WebSocketServerListener::class); - $reflect->bindCallback($this->server, $settings); - } else if ($type === Constant::SERVER_TYPE_UDP) { - /** @var UDPServerListener $reflect */ - $reflect = $this->getNewInstance(UDPServerListener::class); - $reflect->bindCallback($this->server, $settings); - } else if ($type === Constant::SERVER_TYPE_HTTP) { - /** @var HTTPServerListener $reflect */ - $reflect = $this->getNewInstance(HTTPServerListener::class); - $reflect->bindCallback($this->server, $settings); - } else { - /** @var TCPServerListener $reflect */ - $reflect = $this->getNewInstance(TCPServerListener::class); - $reflect->bindCallback($this->server, $settings); + $this->addServiceEvents($settings['events'] ?? [], $this->server); + } + + + /** + * @param array $events + * @param Server $server + * @throws NotFindClassException + * @throws ReflectionException + */ + private function addServiceEvents(array $events, Server $server) + { + foreach ($events as $name => $event) { + if (is_array($event) && is_string($event)) { + $callback[0] = $this->getNewInstance($event[0]); + } + $server->on($name, $event); } } diff --git a/Server/Service/Http.php b/Server/Service/Http.php new file mode 100644 index 00000000..c6218720 --- /dev/null +++ b/Server/Service/Http.php @@ -0,0 +1,71 @@ +router->Branch_search(\Server\Constrict\Request::create($request)); + if (!($node instanceof Node)) { + throw new RequestException('

HTTP 404 Not Found


Powered by Swoole', 404); + } + if (!(($responseData = $node->dispatch()) instanceof ResponseInterface)) { + $responseData = $this->response->setContent($responseData)->setStatusCode(200); + } + } catch (Error | \Throwable $exception) { + $responseData = $this->exceptionHandler->emit($exception, $this->response); + } finally { + $this->responseEmitter->sender($response, $responseData); + $this->eventDispatch->dispatch(new OnAfterRequest()); + } + } + + + /** + * @param Server $server + * @param int $fd + * @throws Exception + */ + public function onDisconnect(Server $server, int $fd): void + { + } + + + /** + * @param Server $server + * @param int $fd + * @throws Exception + */ + public function onClose(Server $server, int $fd): void + { + } + +} diff --git a/Server/Service/Tcp.php b/Server/Service/Tcp.php new file mode 100644 index 00000000..a563cd0f --- /dev/null +++ b/Server/Service/Tcp.php @@ -0,0 +1,57 @@ +status(101); + $response->end(); + } + + + /** + * @param Server $server + * @param Frame $frame + */ + public function onMessage(Server $server, Frame $frame): void + { + // TODO: Implement OnMessage() method. + } + + + /** + * @param Server $server + * @param int $fd + */ + public function onClose(Server $server, int $fd): void + { + // TODO: Implement OnClose() method. + } + + + /** + * @param Server $server + * @param int $fd + */ + public function onDisconnect(Server $server, int $fd): void + { + // TODO: Implement OnDisconnect() method. + } +}