diff --git a/Handler/OnRequest.php b/Handler/OnRequest.php new file mode 100644 index 0000000..704d6b1 --- /dev/null +++ b/Handler/OnRequest.php @@ -0,0 +1,104 @@ +initPsr7RequestAndPsr7Response($request); + + $this->onRequest->onServerRequest($PsrRequest, $request); + } + + + /** + * @param Request $request + * @return RequestInterface + * @throws Exception + */ + private function initPsr7RequestAndPsr7Response(Request $request): RequestInterface + { + /** @var ConstrictResponse $PsrResponse */ + $PsrResponse = Context::set(ResponseInterface::class, new ConstrictResponse()); + $PsrResponse->withContentType($this->response->contentType); + + $serverRequest = (new ConstrictRequest())->withDataHeaders($request->getData()) + ->withUri(static::parse($request)) + ->withProtocolVersion($request->server['server_protocol']) + ->withCookieParams($request->cookie ?? []) + ->withQueryParams($request->get ?? []) + ->withUploadedFiles($request->files ?? []) + ->withMethod($request->getMethod()) + ->withParsedBody($request->post ?? []); + + /** @var ConstrictRequest $PsrRequest */ + return Context::set(RequestInterface::class, $serverRequest); + } + + + /** + * @param Request $request + * @return UriInterface + */ + public static function parse(Request $request): UriInterface + { + $uri = new Uri(); + $uri->withQuery($request->server['query_string'] ?? '') + ->withPath($request->server['path_info']) + ->withPort($request->server['server_port']); + $host = $request->header['host'] ?? '127.0.0.1'; + if (str_contains($host, ':')) { + [$host, $port] = explode(':', $host); + $uri->withHost($host)->withPort((int)$port); + } else { + $uri->withHost($host); + } + if (isset($request->server['https']) && $request->server['https'] !== 'off') { + $uri->withScheme('https'); + } else { + $uri->withScheme('http'); + } + return $uri; + } + + +}