From 8be7975d546f3ab0d5c1652369a0665df11c9d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=C2=B7x?= Date: Sat, 28 Aug 2021 00:52:20 +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-helper/Context/Response.php | 40 +++++++++++-- http-helper/Route/CoreMiddleware.php | 9 +-- http-server/Message/Message.php | 89 +++++++++++++++++++++++++++- http-server/Message/Response.php | 31 ++++++++++ 4 files changed, 157 insertions(+), 12 deletions(-) diff --git a/http-helper/Context/Response.php b/http-helper/Context/Response.php index 79eb8589..de61e8e7 100644 --- a/http-helper/Context/Response.php +++ b/http-helper/Context/Response.php @@ -70,10 +70,42 @@ class Response extends HttpService implements ResponseInterface $this->clientId = $int; $manager = Kiri::getDi()->get(ServerManager::class); $this->_clientInfo = $manager->getServer()->getClientInfo($int); - if (!empty($this->reactorId)) - { - $this->reactorId = $reID; - } + if (!empty($this->reactorId)) { + $this->reactorId = $reID; + } + return $this; + } + + + /** + * @param $value + * @return $this + */ + public function withAccessControlAllowHeaders($value): static + { + $this->headers['Access-Control-Allow-Headers'] = $value; + return $this; + } + + + /** + * @param $value + * @return $this + */ + public function withAccessControlRequestMethod($value): static + { + $this->headers['Access-Control-Request-Method'] = $value; + return $this; + } + + + /** + * @param $value + * @return $this + */ + public function withAccessControlAllowOrigin($value): static + { + $this->headers['Access-Control-Allow-Origin'] = $value; return $this; } diff --git a/http-helper/Route/CoreMiddleware.php b/http-helper/Route/CoreMiddleware.php index e2dde311..dfd58156 100644 --- a/http-helper/Route/CoreMiddleware.php +++ b/http-helper/Route/CoreMiddleware.php @@ -7,7 +7,6 @@ namespace Http\Route; use Closure; use Exception; -use Http\Context\Request; use Http\Context\Response; use Server\RequestInterface; @@ -20,8 +19,6 @@ class CoreMiddleware extends MiddlewareAbstracts { - - /** * @param RequestInterface $request * @param Closure $next @@ -32,9 +29,9 @@ class CoreMiddleware extends MiddlewareAbstracts { /** @var Response $response */ $response = \response(); - $response->addHeader('Access-Control-Allow-Origin', '*'); - $response->addHeader('Access-Control-Allow-Headers', $request->getHeaderLine('Access-Control-Request-Headers')); - $response->addHeader('Access-Control-Request-Method', $request->getHeaderLine('Access-Control-Request-Method')); + $response->withAccessControlAllowOrigin($request->getUri()->getHost()); + $response->withAccessControlRequestMethod($request->getAccessControlRequestMethod()); + $response->withAccessControlAllowHeaders($request->getAccessControlRequestMethod()); return $next($request); } diff --git a/http-server/Message/Message.php b/http-server/Message/Message.php index 22bffd75..d59bad2f 100644 --- a/http-server/Message/Message.php +++ b/http-server/Message/Message.php @@ -4,9 +4,7 @@ namespace Server\Message; use JetBrains\PhpStorm\Pure; use Kiri\Core\Xml; -use Kiri\Kiri; use Psr\Http\Message\StreamInterface; -use ReflectionException; /** @@ -27,6 +25,9 @@ trait Message public array $servers = []; + public array $cookies = []; + + /** * @return string */ @@ -36,6 +37,62 @@ trait Message } + /** + * @param $name + * @param null $value + * @param null $expires + * @param null $path + * @param null $domain + * @param null $secure + * @param null $httponly + * @param null $samesite + * @param null $priority + * @return static + */ + public function withCookie($name, $value = null, $expires = null, $path = null, $domain = null, $secure = null, $httponly = null, $samesite = null, $priority = null): static + { + $class = clone $this; + $class->cookies[$name] = [$value, $expires, $path, $domain, $secure, $httponly, $samesite, $priority]; + return $class; + } + + + /** + * @return array + */ + public function getCookie(): array + { + return $this->cookies; + } + + + /** + * @return string + */ + #[Pure] public function getAccessControlAllowOrigin(): string + { + return $this->getHeaderLine('Access-Control-Allow-Origin'); + } + + + /** + * @return string + */ + #[Pure] public function getAccessControlRequestHeaders(): string + { + return $this->getHeaderLine('Access-Control-Request-Headers'); + } + + + /** + * @return string + */ + #[Pure] public function getAccessControlRequestMethod(): string + { + return $this->getHeaderLine('Access-Control-Request-Method'); + } + + /** * @param $version * @return $this @@ -217,4 +274,32 @@ trait Message return $content; } + + public function redirectTo($host) + { + return $this->withHeader('Location', $host) + ->withStatus(302); + } + + + public function getStreamData() + { + $response = new \Swoole\Http\Response(); + $response->setStatusCode($this->statusCode); + $response->setHeader('Run-Time', time()); + if (!empty($this->headers) && is_array($this->headers)) { + foreach ($this->headers as $name => $values) { + $response->setHeader($name, implode(';', $values)); + } + $this->headers = []; + } + if (!empty($this->cookies) && is_array($this->cookies)) { + foreach ($this->cookies as $name => $cookie) { + $response->cookie($name, ...$cookie); + } + $this->cookies = []; + } + } + + } diff --git a/http-server/Message/Response.php b/http-server/Message/Response.php index 6546e59c..6e5a3902 100644 --- a/http-server/Message/Response.php +++ b/http-server/Message/Response.php @@ -50,4 +50,35 @@ class Response implements ResponseInterface // TODO: Implement getReasonPhrase() method. return $this->reasonPhrase; } + + + /** + * @param $value + * @return ResponseInterface + */ + public function withAccessControlAllowHeaders($value): ResponseInterface + { + return $this->withHeader('Access-Control-Allow-Headers', $value); + } + + + /** + * @param $value + * @return ResponseInterface + */ + public function withAccessControlRequestMethod($value): ResponseInterface + { + return $this->withHeader('Access-Control-Request-Method', $value); + } + + + /** + * @param $value + * @return ResponseInterface + */ + public function withAccessControlAllowOrigin($value): ResponseInterface + { + return $this->withHeader('Access-Control-Allow-Origin', $value); + } + }