diff options
Diffstat (limited to 'vendor/league/uri/Http.php')
-rw-r--r-- | vendor/league/uri/Http.php | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/vendor/league/uri/Http.php b/vendor/league/uri/Http.php new file mode 100644 index 000000000..0293a9864 --- /dev/null +++ b/vendor/league/uri/Http.php @@ -0,0 +1,327 @@ +<?php + +/** + * League.Uri (https://uri.thephpleague.com) + * + * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri; + +use Deprecated; +use JsonSerializable; +use League\Uri\Contracts\UriException; +use League\Uri\Contracts\UriInterface; +use League\Uri\Exceptions\SyntaxError; +use League\Uri\UriTemplate\TemplateCanNotBeExpanded; +use Psr\Http\Message\UriInterface as Psr7UriInterface; +use Stringable; + +/** + * @phpstan-import-type InputComponentMap from UriString + */ +final class Http implements Stringable, Psr7UriInterface, JsonSerializable +{ + private readonly UriInterface $uri; + + private function __construct(UriInterface $uri) + { + if (null === $uri->getScheme() && '' === $uri->getHost()) { + throw new SyntaxError('An URI without scheme cannot contain an empty host string according to PSR-7: '.$uri); + } + + $port = $uri->getPort(); + if (null !== $port && ($port < 0 || $port > 65535)) { + throw new SyntaxError('The URI port is outside the established TCP and UDP port ranges: '.$uri); + } + + $this->uri = $this->normalizePsr7Uri($uri); + } + + /** + * PSR-7 UriInterface makes the following normalization. + * + * Safely stringify input when possible for League UriInterface compatibility. + * + * Query, Fragment and User Info when undefined are normalized to the empty string + */ + private function normalizePsr7Uri(UriInterface $uri): UriInterface + { + $components = []; + if ('' === $uri->getFragment()) { + $components['fragment'] = null; + } + + if ('' === $uri->getQuery()) { + $components['query'] = null; + } + + if ('' === $uri->getUserInfo()) { + $components['user'] = null; + $components['pass'] = null; + } + + return match ($components) { + [] => $uri, + default => Uri::fromComponents([...$uri->toComponents(), ...$components]), + }; + } + + /** + * Create a new instance from a string or a stringable object. + */ + public static function new(Stringable|string $uri = ''): self + { + return self::fromComponents(UriString::parse($uri)); + } + + /** + * Create a new instance from a hash of parse_url parts. + * + * @param InputComponentMap $components a hash representation of the URI similar + * to PHP parse_url function result + */ + public static function fromComponents(array $components): self + { + $components += [ + 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null, + 'port' => null, 'path' => '', 'query' => null, 'fragment' => null, + ]; + + if ('' === $components['user']) { + $components['user'] = null; + } + + if ('' === $components['pass']) { + $components['pass'] = null; + } + + if ('' === $components['query']) { + $components['query'] = null; + } + + if ('' === $components['fragment']) { + $components['fragment'] = null; + } + + return new self(Uri::fromComponents($components)); + } + + /** + * Create a new instance from the environment. + */ + public static function fromServer(array $server): self + { + return new self(Uri::fromServer($server)); + } + + /** + * Create a new instance from a URI and a Base URI. + * + * The returned URI must be absolute. + */ + public static function fromBaseUri(Stringable|string $uri, Stringable|string|null $baseUri = null): self + { + return new self(Uri::fromBaseUri($uri, $baseUri)); + } + + /** + * Creates a new instance from a template. + * + * @throws TemplateCanNotBeExpanded if the variables are invalid or missing + * @throws UriException if the variables are invalid or missing + */ + public static function fromTemplate(Stringable|string $template, iterable $variables = []): self + { + return new self(Uri::fromTemplate($template, $variables)); + } + + public function getScheme(): string + { + return $this->uri->getScheme() ?? ''; + } + + public function getAuthority(): string + { + return $this->uri->getAuthority() ?? ''; + } + + public function getUserInfo(): string + { + return $this->uri->getUserInfo() ?? ''; + } + + public function getHost(): string + { + return $this->uri->getHost() ?? ''; + } + + public function getPort(): ?int + { + return $this->uri->getPort(); + } + + public function getPath(): string + { + return $this->uri->getPath(); + } + + public function getQuery(): string + { + return $this->uri->getQuery() ?? ''; + } + + public function getFragment(): string + { + return $this->uri->getFragment() ?? ''; + } + + public function __toString(): string + { + return $this->uri->toString(); + } + + public function jsonSerialize(): string + { + return $this->uri->toString(); + } + + /** + * Safely stringify input when possible for League UriInterface compatibility. + */ + private function filterInput(string $str): ?string + { + return match ('') { + $str => null, + default => $str, + }; + } + + private function newInstance(UriInterface $uri): self + { + return match ($this->uri->toString()) { + $uri->toString() => $this, + default => new self($uri), + }; + } + + public function withScheme(string $scheme): self + { + return $this->newInstance($this->uri->withScheme($this->filterInput($scheme))); + } + + public function withUserInfo(string $user, ?string $password = null): self + { + return $this->newInstance($this->uri->withUserInfo($this->filterInput($user), $password)); + } + + public function withHost(string $host): self + { + return $this->newInstance($this->uri->withHost($this->filterInput($host))); + } + + public function withPort(?int $port): self + { + return $this->newInstance($this->uri->withPort($port)); + } + + public function withPath(string $path): self + { + return $this->newInstance($this->uri->withPath($path)); + } + + public function withQuery(string $query): self + { + return $this->newInstance($this->uri->withQuery($this->filterInput($query))); + } + + public function withFragment(string $fragment): self + { + return $this->newInstance($this->uri->withFragment($this->filterInput($fragment))); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated Since version 7.0.0 + * @codeCoverageIgnore + * @see Http::new() + * + * Create a new instance from a string. + */ + #[Deprecated(message:'use League\Uri\Http::new() instead', since:'league/uri:7.0.0')] + public static function createFromString(Stringable|string $uri = ''): self + { + return self::new($uri); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated Since version 7.0.0 + * @codeCoverageIgnore + * @see Http::fromComponents() + * + * Create a new instance from a hash of parse_url parts. + * + * @param InputComponentMap $components a hash representation of the URI similar + * to PHP parse_url function result + */ + #[Deprecated(message:'use League\Uri\Http::fromComponents() instead', since:'league/uri:7.0.0')] + public static function createFromComponents(array $components): self + { + return self::fromComponents($components); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated Since version 7.0.0 + * @codeCoverageIgnore + * @see Http::fromServer() + * + * Create a new instance from the environment. + */ + #[Deprecated(message:'use League\Uri\Http::fromServer() instead', since:'league/uri:7.0.0')] + public static function createFromServer(array $server): self + { + return self::fromServer($server); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated Since version 7.0.0 + * @codeCoverageIgnore + * @see Http::new() + * + * Create a new instance from a URI object. + */ + #[Deprecated(message:'use League\Uri\Http::new() instead', since:'league/uri:7.0.0')] + public static function createFromUri(Psr7UriInterface|UriInterface $uri): self + { + return self::new($uri); + } + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated Since version 7.0.0 + * @codeCoverageIgnore + * @see Http::fromBaseUri() + * + * Create a new instance from a URI and a Base URI. + * + * The returned URI must be absolute. + */ + #[Deprecated(message:'use League\Uri\Http::fromBaseUri() instead', since:'league/uri:7.0.0')] + public static function createFromBaseUri(Stringable|string $uri, Stringable|string|null $baseUri = null): self + { + return self::fromBaseUri($uri, $baseUri); + } +} |