From b60e38dd92029ec7dc41ef4ca1c44680b27df160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=C2=B7x?= Date: Tue, 31 Aug 2021 14:01:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http-server/Message/Response.php | 26 +++--- http-server/Service/Http.php | 132 +++++++++++++++---------------- 2 files changed, 77 insertions(+), 81 deletions(-) diff --git a/http-server/Message/Response.php b/http-server/Message/Response.php index dffa4605..243ce208 100644 --- a/http-server/Message/Response.php +++ b/http-server/Message/Response.php @@ -122,7 +122,10 @@ class Response implements ResponseInterface, \Server\ResponseInterface */ public function json($data): ResponseInterface { - return $this->withBody(static::parser($data, self::CONTENT_TYPE_JSON)) + if (!is_array($data = $this->_toArray($data))) { + throw new Exception('Json data format error.'); + } + return $this->withBody(new Stream(json_encode($this->_toArray($data)))) ->withContentType(self::CONTENT_TYPE_JSON); } @@ -134,7 +137,7 @@ class Response implements ResponseInterface, \Server\ResponseInterface */ public function html($data): ResponseInterface { - return $this->withBody(static::parser($data, self::CONTENT_TYPE_HTML)) + return $this->withBody(new Stream((string)$this->_toArray($data))) ->withContentType(self::CONTENT_TYPE_HTML); } @@ -146,29 +149,24 @@ class Response implements ResponseInterface, \Server\ResponseInterface */ public function xml($data): ResponseInterface { - return $this->withBody(static::parser($data, self::CONTENT_TYPE_XML)) + if (!is_array($data = $this->_toArray($data))) { + throw new Exception('Xml data format error.'); + } + return $this->withBody(new Stream(Help::toXml($data))) ->withContentType(self::CONTENT_TYPE_XML); } /** * @param $responseData - * @param string $contentType - * @return Stream - * @throws Exception + * @return string|array|bool|int|null */ - public static function parser($responseData, $contentType = self::CONTENT_TYPE_JSON): Stream + public function _toArray($responseData): string|array|null|bool|int { if (is_object($responseData)) { $responseData = $responseData instanceof ToArray ? $responseData->toArray() : get_object_vars($responseData); } - if ($contentType == self::CONTENT_TYPE_JSON) { - return new Stream(json_encode($responseData)); - } - if ($contentType == self::CONTENT_TYPE_XML) { - return new Stream(Help::toXml($responseData)); - } - return new Stream((string)($responseData)); + return $responseData; } } diff --git a/http-server/Service/Http.php b/http-server/Service/Http.php index 942a58ab..a07c1848 100644 --- a/http-server/Service/Http.php +++ b/http-server/Service/Http.php @@ -6,7 +6,7 @@ namespace Server\Service; use Exception; use Http\Exception\RequestException; use Http\Route\Node; -use Kiri\ToArray; +use Kiri\Core\Help; use Server\Events\OnAfterRequest; use Server\Message\Stream; use Server\ResponseInterface; @@ -16,6 +16,7 @@ use Swoole\Error; use Swoole\Http\Request; use Swoole\Http\Response; use Swoole\Server; +use Server\Message\Response as MsgResponse; /** * @@ -24,38 +25,38 @@ class Http extends \Server\Abstracts\Http implements OnClose, OnConnect { - /** - * @param Server $server - * @param int $fd - */ - public function onConnect(Server $server, int $fd): void - { - // TODO: Implement onConnect() method. - } + /** + * @param Server $server + * @param int $fd + */ + public function onConnect(Server $server, int $fd): void + { + // TODO: Implement onConnect() method. + } - /** - * @param Request $request - * @param Response $response - */ - public function onRequest(Request $request, Response $response): void - { - // TODO: Implement onRequest() method. - try { - $node = $this->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->transferToResponse($responseData); - } - } catch (Error | \Throwable $exception) { - $responseData = $this->exceptionHandler->emit($exception, $this->response); - } finally { - $this->responseEmitter->sender($response, $responseData); - $this->eventDispatch->dispatch(new OnAfterRequest()); - } - } + /** + * @param Request $request + * @param Response $response + */ + public function onRequest(Request $request, Response $response): void + { + // TODO: Implement onRequest() method. + try { + $node = $this->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->transferToResponse($responseData); + } + } catch (Error | \Throwable $exception) { + $responseData = $this->exceptionHandler->emit($exception, $this->response); + } finally { + $this->responseEmitter->sender($response, $responseData); + $this->eventDispatch->dispatch(new OnAfterRequest()); + } + } /** @@ -63,45 +64,42 @@ class Http extends \Server\Abstracts\Http implements OnClose, OnConnect * @return ResponseInterface * @throws Exception */ - private function transferToResponse($responseData): ResponseInterface - { - $interface = $this->response->withStatus(200); - if (is_object($responseData)) { - if (!($responseData instanceof ToArray)) { - $responseData = get_object_vars($responseData); - } else { - $responseData = $responseData->toArray(); - } - } - if (is_array($responseData)) { - $responseData = new Stream(json_encode($responseData, JSON_UNESCAPED_UNICODE)); - } else { - $responseData = new Stream((string)$responseData); - } - if (!$interface->hasHeader('Content-Type')) { - $interface->withContentType(\Server\Message\Response::CONTENT_TYPE_JSON); - } - return $interface->withBody($responseData); - } + private function transferToResponse($responseData): ResponseInterface + { + $interface = $this->response->withStatus(200); + if (!$interface->hasHeader('Content-Type')) { + $interface->withContentType(MsgResponse::CONTENT_TYPE_JSON); + } + $responseData = $interface->_toArray($responseData); + if ($interface->getHeader('Content-Type') == MsgResponse::CONTENT_TYPE_XML) { + $responseData = Help::toXml($responseData); + } + if (is_array($responseData)) { + $responseData = new Stream(json_encode($responseData, JSON_UNESCAPED_UNICODE)); + } else { + $responseData = new Stream((string)$responseData); + } + return $interface->withBody($responseData); + } - /** - * @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 onDisconnect(Server $server, int $fd): void + { + } - /** - * @param Server $server - * @param int $fd - * @throws Exception - */ - public function onClose(Server $server, int $fd): void - { - } + /** + * @param Server $server + * @param int $fd + * @throws Exception + */ + public function onClose(Server $server, int $fd): void + { + } }