diff --git a/.phpstorm.meta.php b/.phpstorm.meta.php index cd92eb0a..dea7253c 100644 --- a/.phpstorm.meta.php +++ b/.phpstorm.meta.php @@ -6,6 +6,7 @@ namespace PHPSTORM_META { use Snowflake\Di\Container; override(Container::get(0), map('@')); + override(Container::newObject(0), map('@')); // override(\Hyperf\Utils\Context::get(0), map('@')); // override(\make(0), map('@')); override(\di(0), map('@')); diff --git a/HttpServer/Http/HttpHeaders.php b/HttpServer/Http/HttpHeaders.php index 9146b5ec..396f1986 100644 --- a/HttpServer/Http/HttpHeaders.php +++ b/HttpServer/Http/HttpHeaders.php @@ -16,6 +16,18 @@ namespace HttpServer\Http; class HttpHeaders { + private array $_headers = []; + + + /** + * @param array $headers + */ + public function setHeaders(array $headers): void + { + $this->_headers = $headers; + } + + /** * @return array */ @@ -111,12 +123,11 @@ class HttpHeaders */ private function __handler__($name = null, $default = null): mixed { - /** @var \Swoole\Http\Request $context */ - $context = Context::getContext(\Swoole\Http\Request::class); + $headers = Context::getContext(Request::class); if (!empty($name)) { - return $context->header[$name] ?? $default; + return $headers->_headers[$name] ?? $default; } - return $context->header; + return $headers->_headers; } } diff --git a/HttpServer/Http/HttpParams.php b/HttpServer/Http/HttpParams.php index a4ac6bc1..e11bf48c 100644 --- a/HttpServer/Http/HttpParams.php +++ b/HttpServer/Http/HttpParams.php @@ -11,7 +11,6 @@ namespace HttpServer\Http; use Exception; use HttpServer\Exception\RequestException; -use JetBrains\PhpStorm\Pure; use ReflectionException; use Snowflake\Core\Json; use Snowflake\Core\Xml; @@ -36,6 +35,47 @@ class HttpParams /** @var array|null */ private ?array $_files = []; + + private mixed $_rawContent = ''; + + /** + * @param array|null $gets + */ + public function setGets(?array $gets): void + { + $this->_gets = $gets; + } + + /** + * @param mixed $posts + */ + public function setPosts(mixed $posts): void + { + $this->_posts = $posts; + } + + /** + * @param array|null $files + */ + public function setFiles(?array $files): void + { + $this->_files = $files; + } + + /** + * @param mixed|string $rawContent + */ + public function setRawContent(mixed $rawContent, string $context_type): void + { + if (str_contains($context_type, 'json')) { + $this->_rawContent = json_decode($rawContent, true); + } else if (str_contains($context_type, 'xml')) { + $this->_rawContent = Xml::toArray($rawContent); + } else { + $this->_rawContent = $rawContent; + } + } + /** * @return mixed * @throws Exception @@ -414,10 +454,10 @@ class HttpParams */ private function __files__($name = null): mixed { - /** @var \Swoole\Http\Request $content */ - $content = Context::getContext(\Swoole\Http\Request::class); + /** @var Request $content */ + $content = Context::getContext(Request::class); if (!empty($name)) { - return $content->files[$name] ?? null; + return $content->_f[$name] ?? null; } return $content->files ?? []; } diff --git a/HttpServer/Http/Request.php b/HttpServer/Http/Request.php index 71e5b242..58ea8bae 100644 --- a/HttpServer/Http/Request.php +++ b/HttpServer/Http/Request.php @@ -8,9 +8,9 @@ use Exception; use HttpServer\Abstracts\HttpService; use HttpServer\IInterface\AuthIdentity; use JetBrains\PhpStorm\Pure; +use Server\RequestInterface; use Server\ServerManager; use Snowflake\Core\Json; -use Snowflake\Snowflake; defined('REQUEST_OK') or define('REQUEST_OK', 0); defined('REQUEST_FAIL') or define('REQUEST_FAIL', 500); @@ -30,7 +30,7 @@ defined('REQUEST_FAIL') or define('REQUEST_FAIL', 500); * @property-read $isPackage * @property-read $isReceive */ -class Request extends HttpService +class Request extends HttpService implements RequestInterface { public int $fd = 0; @@ -56,6 +56,8 @@ class Request extends HttpService public int $statusCode = 200; + private int $_clientId = 0; + /** @var string[] */ private array $explode = []; @@ -74,6 +76,26 @@ class Request extends HttpService private ?AuthIdentity $_grant = null; + /** + * @param $id + */ + public function setClientId($id) + { + $this->_clientId = $id; + } + + + /** + * @param string $request_uri + */ + public function setUri(string $request_uri) + { + $request_uri = array_filter(explode('/', $request_uri)); + + $this->_explode = $request_uri; + $this->_uri = '/' . implode('/', $request_uri); + } + /** * @return array|null * @throws Exception @@ -100,9 +122,7 @@ class Request extends HttpService */ public function getClientId(): int { - $request = Context::getContext(\Swoole\Http\Request::class); - - return $request->fd ?? 0; + return $this->_clientId ?? 0; } @@ -119,8 +139,7 @@ class Request extends HttpService */ public function getIdentity(): ?AuthIdentity { - $request = Context::getContext(\Swoole\Http\Request::class); - return $request->grant; + return $this->_grant; } /** @@ -176,8 +195,7 @@ class Request extends HttpService */ public function setGrantAuthorization($value) { - $request = Context::getContext(\Swoole\Http\Request::class); - return $request->grant = $value; + return $this->_grant = $value; } @@ -195,7 +213,7 @@ class Request extends HttpService */ public function getExplode(): array { - return Context::getContext(\Swoole\Http\Request::class)->explode; + return $this->_explode; } /** @@ -212,7 +230,7 @@ class Request extends HttpService */ public function getUri(): string { - return $this->headers->getRequestUri(); + return $this->_uri; } /** @@ -417,25 +435,8 @@ class Request extends HttpService } - /** - * @param \Swoole\Http\Request $request - * @return Request - * @throws Exception - */ - public static function create(\Swoole\Http\Request $request): Request - { - $request->header = array_merge($request->header, $request->server); - - $request_uri = array_filter(explode('/', $request->header['request_uri'])); - $request->header['request_uri'] = '/' . implode('/', $request_uri); - $request->explode = $request_uri; - - Context::setContext(\Swoole\Http\Request::class, $request); - - Context::setContext(Response::class, new Response()); - - return Snowflake::getDi()->get(Request::class); - } + private array $_explode = []; + private string $_uri = ''; } diff --git a/HttpServer/Route/Router.php b/HttpServer/Route/Router.php index 334ee7fa..60c4b8bc 100644 --- a/HttpServer/Route/Router.php +++ b/HttpServer/Route/Router.php @@ -15,6 +15,7 @@ use HttpServer\IInterface\RouterInterface; use JetBrains\PhpStorm\Pure; use ReflectionException; use Rpc\Actuator; +use Server\RequestInterface; use Snowflake\Abstracts\Config; use Snowflake\Exception\ConfigException; use Snowflake\Exception\NotFindClassException; @@ -522,12 +523,12 @@ class Router extends HttpService implements RouterInterface /** - * @param Request $request + * @param RequestInterface $request * @return Node|null * 树杈搜索 * @throws RequestException */ - public function Branch_search(Request $request): ?Node + public function Branch_search(RequestInterface $request): ?Node { $node = $this->tree_search($request->getExplode(), $request->getMethod()); if ($node instanceof Node) { diff --git a/Server/Constrict/Request.php b/Server/Constrict/Request.php new file mode 100644 index 00000000..c6e8277e --- /dev/null +++ b/Server/Constrict/Request.php @@ -0,0 +1,61 @@ +{$name}(...$args); + } + + + /** + * @param \Swoole\Http\Request $request + * @return Request + * @throws ReflectionException + * @throws NotFindClassException + */ + public static function create(\Swoole\Http\Request $request): RequestInterface + { + $sRequest = new HttpResponse(); + $sRequest->setUri($request->header['request_uri']); + $sRequest->setClientId($request->fd); + + $sRequest->headers = new HttpHeaders(); + $sRequest->headers->setHeaders(array_merge($request->header, $request->server)); + + $sRequest->params = new HttpParams(); + $sRequest->params->setRawContent($request->rawContent(), $sRequest->headers->getContentType()); + $sRequest->params->setFiles($request->files); + $sRequest->params->setPosts($request->post); + $sRequest->params->setGets($request->get); + + Context::setContext(Request::class, $sRequest); + + Context::setContext(Response::class, new Response()); + + return Snowflake::getDi()->get(Request::class); + } +} diff --git a/Server/HTTPServerListener.php b/Server/HTTPServerListener.php index c514e745..20bb298d 100644 --- a/Server/HTTPServerListener.php +++ b/Server/HTTPServerListener.php @@ -117,7 +117,7 @@ class HTTPServerListener extends Abstracts\Server public function onRequest(Request $request, Response $response) { try { - $node = $this->router->Branch_search(HSRequest::create($request)); + $node = $this->router->Branch_search(Constrict\Request::create($request)); if (!($node instanceof Node)) { throw new RequestException('