From b9a1178fbe8484769cb88731a44a4c210deecbb1 Mon Sep 17 00:00:00 2001 From: "as2252258@163.com" Date: Fri, 24 Sep 2021 02:04:36 +0800 Subject: [PATCH] 111 --- http-server/Abstracts/Http.php | 50 ----------- http-server/Abstracts/Tcp.php | 45 ---------- http-server/Abstracts/Udp.php | 49 ----------- .../{ => Utility}/EventDispatchHelper.php | 2 +- .../{ => Utility}/ResponseHelper.php | 2 +- http-server/Abstracts/Websocket.php | 82 ------------------- http-server/Service/Http.php | 38 ++++++++- http-server/Service/Tcp.php | 37 ++++++++- http-server/Service/Udp.php | 38 ++++++++- http-server/Service/WebSocket.php | 62 +++++++++++++- 10 files changed, 168 insertions(+), 237 deletions(-) delete mode 100644 http-server/Abstracts/Http.php delete mode 100644 http-server/Abstracts/Tcp.php delete mode 100644 http-server/Abstracts/Udp.php rename http-server/Abstracts/{ => Utility}/EventDispatchHelper.php (84%) rename http-server/Abstracts/{ => Utility}/ResponseHelper.php (89%) delete mode 100644 http-server/Abstracts/Websocket.php diff --git a/http-server/Abstracts/Http.php b/http-server/Abstracts/Http.php deleted file mode 100644 index ed617068..00000000 --- a/http-server/Abstracts/Http.php +++ /dev/null @@ -1,50 +0,0 @@ -exceptionHandler = Kiri::getDi()->get($exceptionHandler); - $this->responseEmitter = Kiri::getDi()->get(ResponseEmitter::class); - } - -} diff --git a/http-server/Abstracts/Tcp.php b/http-server/Abstracts/Tcp.php deleted file mode 100644 index ed9c30ff..00000000 --- a/http-server/Abstracts/Tcp.php +++ /dev/null @@ -1,45 +0,0 @@ -exceptionHandler = Kiri::getDi()->get($exceptionHandler); - $this->responseEmitter = Kiri::getDi()->get(TcpEmitter::class); - } - -} diff --git a/http-server/Abstracts/Udp.php b/http-server/Abstracts/Udp.php deleted file mode 100644 index 195ce333..00000000 --- a/http-server/Abstracts/Udp.php +++ /dev/null @@ -1,49 +0,0 @@ -exceptionHandler = Kiri::getDi()->get($exceptionHandler); - $this->responseEmitter = Kiri::getDi()->get(UdpEmitter::class); - } - -} diff --git a/http-server/Abstracts/EventDispatchHelper.php b/http-server/Abstracts/Utility/EventDispatchHelper.php similarity index 84% rename from http-server/Abstracts/EventDispatchHelper.php rename to http-server/Abstracts/Utility/EventDispatchHelper.php index 2852a277..ffca07e0 100644 --- a/http-server/Abstracts/EventDispatchHelper.php +++ b/http-server/Abstracts/Utility/EventDispatchHelper.php @@ -1,6 +1,6 @@ exceptionHandler = Kiri::getDi()->get($exceptionHandler); - $this->responseEmitter = Kiri::getDi()->get(WebSocketEmitter::class); - } - - - - /** - * @param Request $request - * @param Response $response - * @throws Exception - */ - public function onHandshake(Request $request, Response $response): void - { - // TODO: Implement OnHandshake() method. - $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'])) { - $explode = explode(',',$request->header['sec-websocket-protocol']); - $headers['Sec-websocket-Protocol'] = $explode[0]; - } - foreach ($headers as $key => $val) { - $response->setHeader($key, $val); - } - } - - -} diff --git a/http-server/Service/Http.php b/http-server/Service/Http.php index d90b9721..0018d3d9 100644 --- a/http-server/Service/Http.php +++ b/http-server/Service/Http.php @@ -9,17 +9,26 @@ use Http\Handler\Context; use Http\Handler\Abstracts\HandlerManager; use Http\Handler\Dispatcher; use Http\Handler\Handler; +use Http\Handler\Router; use Http\Message\ContentType; use Http\Message\ServerRequest; use Http\Message\Stream; use Http\Handler\Abstracts\MiddlewareManager; +use Kiri\Abstracts\Config; +use Kiri\Exception\ConfigException; use Kiri\Kiri; use Psr\Http\Message\ServerRequestInterface; +use Server\Abstracts\Utility\EventDispatchHelper; +use Server\Abstracts\Utility\ResponseHelper; use Server\Constrict\RequestInterface; +use Server\Constrict\ResponseEmitter; use Server\Constrict\ResponseInterface; use Server\Events\OnAfterRequest; +use Server\ExceptionHandlerDispatcher; +use Server\ExceptionHandlerInterface; use Server\SInterface\OnClose; use Server\SInterface\OnConnect; +use Server\SInterface\OnRequest; use Swoole\Http\Request; use Swoole\Http\Response; use Swoole\Server; @@ -27,9 +36,36 @@ use Swoole\Server; /** * */ -class Http extends \Server\Abstracts\Http implements OnClose, OnConnect +class Http implements OnClose, OnConnect, OnRequest { + use EventDispatchHelper; + use ResponseHelper; + + /** @var Router|mixed */ + #[Inject(Router::class)] + public Router $router; + + + /** + * @var ExceptionHandlerInterface + */ + public ExceptionHandlerInterface $exceptionHandler; + + + /** + * @throws ConfigException + */ + public function init() + { + $exceptionHandler = Config::get('exception.http', ExceptionHandlerDispatcher::class); + if (!in_array(ExceptionHandlerInterface::class, class_implements($exceptionHandler))) { + $exceptionHandler = ExceptionHandlerDispatcher::class; + } + $this->exceptionHandler = Kiri::getDi()->get($exceptionHandler); + $this->responseEmitter = Kiri::getDi()->get(ResponseEmitter::class); + } + /** * @param Server $server diff --git a/http-server/Service/Tcp.php b/http-server/Service/Tcp.php index a563cd0f..76d691b5 100644 --- a/http-server/Service/Tcp.php +++ b/http-server/Service/Tcp.php @@ -2,19 +2,52 @@ namespace Server\Service; +use Kiri\Abstracts\Config; +use Kiri\Exception\ConfigException; +use Kiri\Kiri; +use Server\Abstracts\Utility\EventDispatchHelper; +use Server\Abstracts\Utility\ResponseHelper; +use Server\Constrict\TcpEmitter; +use Server\ExceptionHandlerDispatcher; +use Server\ExceptionHandlerInterface; use Server\SInterface\OnClose; use Server\SInterface\OnConnect; +use Server\SInterface\OnReceive; use Swoole\Server; /** * */ -class Tcp extends \Server\Abstracts\Tcp implements OnConnect, OnClose +class Tcp implements OnConnect, OnClose, OnReceive { + use EventDispatchHelper; + use ResponseHelper; - /** + + /** + * @var ExceptionHandlerInterface + */ + public ExceptionHandlerInterface $exceptionHandler; + + + /** + * @throws ConfigException + */ + public function init() + { + $exceptionHandler = Config::get('exception.tcp', ExceptionHandlerDispatcher::class); + if (!in_array(ExceptionHandlerInterface::class, class_implements($exceptionHandler))) { + $exceptionHandler = ExceptionHandlerDispatcher::class; + } + $this->exceptionHandler = Kiri::getDi()->get($exceptionHandler); + $this->responseEmitter = Kiri::getDi()->get(TcpEmitter::class); + } + + + + /** * @param Server $server * @param int $fd */ diff --git a/http-server/Service/Udp.php b/http-server/Service/Udp.php index 217db8db..81c4e81f 100644 --- a/http-server/Service/Udp.php +++ b/http-server/Service/Udp.php @@ -4,17 +4,51 @@ namespace Server\Service; +use Kiri\Abstracts\Config; +use Kiri\Exception\ConfigException; +use Kiri\Kiri; use Server\Abstracts\Server; +use Server\Abstracts\Utility\EventDispatchHelper; +use Server\Abstracts\Utility\ResponseHelper; +use Server\Constrict\UdpEmitter; +use Server\ExceptionHandlerDispatcher; +use Server\ExceptionHandlerInterface; +use Server\SInterface\OnPacket; /** * */ -class Udp extends \Server\Abstracts\Udp +class Udp implements OnPacket { + use EventDispatchHelper; + use ResponseHelper; - /** + + + /** + * @var ExceptionHandlerInterface + */ + public ExceptionHandlerInterface $exceptionHandler; + + + /** + * @throws ConfigException + */ + public function init() + { + $exceptionHandler = Config::get('exception.udp', ExceptionHandlerDispatcher::class); + if (!in_array(ExceptionHandlerInterface::class, class_implements($exceptionHandler))) { + $exceptionHandler = ExceptionHandlerDispatcher::class; + } + $this->exceptionHandler = Kiri::getDi()->get($exceptionHandler); + $this->responseEmitter = Kiri::getDi()->get(UdpEmitter::class); + } + + + + /** * @param Server $server * @param string $data * @param array $clientInfo diff --git a/http-server/Service/WebSocket.php b/http-server/Service/WebSocket.php index f6e39615..75110398 100644 --- a/http-server/Service/WebSocket.php +++ b/http-server/Service/WebSocket.php @@ -4,6 +4,17 @@ namespace Server\Service; use Exception; +use Kiri\Abstracts\Config; +use Kiri\Exception\ConfigException; +use Kiri\Kiri; +use Server\Abstracts\Utility\EventDispatchHelper; +use Server\Abstracts\Utility\ResponseHelper; +use Server\Constrict\WebSocketEmitter; +use Server\ExceptionHandlerDispatcher; +use Server\ExceptionHandlerInterface; +use Server\SInterface\OnClose; +use Server\SInterface\OnHandshake; +use Server\SInterface\OnMessage; use Server\SInterface\OnRequest; use Swoole\Http\Request; use Swoole\Http\Response; @@ -13,19 +24,62 @@ use Swoole\WebSocket\Frame; /** * */ -class WebSocket extends \Server\Abstracts\Websocket +class WebSocket implements OnHandshake, OnMessage, OnClose { - /** + use EventDispatchHelper; + use ResponseHelper; + + + /** + * @var ExceptionHandlerInterface + */ + public ExceptionHandlerInterface $exceptionHandler; + + + /** + * @throws ConfigException + */ + public function init() + { + $exceptionHandler = Config::get('exception.websocket', ExceptionHandlerDispatcher::class); + if (!in_array(ExceptionHandlerInterface::class, class_implements($exceptionHandler))) { + $exceptionHandler = ExceptionHandlerDispatcher::class; + } + $this->exceptionHandler = Kiri::getDi()->get($exceptionHandler); + $this->responseEmitter = Kiri::getDi()->get(WebSocketEmitter::class); + } + + + + /** * @param Request $request * @param Response $response * @throws Exception */ public function onHandshake(Request $request, Response $response): void { - parent::onHandshake($request, $response); // TODO: Change the autogenerated stub - + // TODO: Implement OnHandshake() method. + $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'])) { + $explode = explode(',',$request->header['sec-websocket-protocol']); + $headers['Sec-websocket-Protocol'] = $explode[0]; + } + foreach ($headers as $key => $val) { + $response->setHeader($key, $val); + } $response->status(101); $response->end(); }