%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/bookmarks/vendor/rowbot/url/src/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/bookmarks/vendor/rowbot/url/src/URLRecord.php |
<?php declare(strict_types=1); namespace Rowbot\URL; use Rowbot\URL\Component\Host\NullHost; use Rowbot\URL\Component\PathList; use Rowbot\URL\Component\Scheme; class URLRecord { /** * An ASCII string that identifies the type of URL. * * @var \Rowbot\URL\Component\Scheme */ public $scheme; /** * An ASCII string identifying a username. * * @var string */ public $username; /** * An ASCII string identifying a password. * * @var string */ public $password; /** * @var \Rowbot\URL\Component\Host\HostInterface */ public $host; /** * A 16-bit unsigned integer that identifies a networking port. * * @var int|null */ public $port; /** * A list of zero or more ASCII strings holding data. * * @var \Rowbot\URL\Component\PathListInterface */ public $path; /** * An ASCII string holding data. * * @var string|null */ public $query; /** * An ASCII string holding data. * * @var string|null */ public $fragment; /** * Identifies whether the URL can act as a base URL. * * @var bool */ public $cannotBeABaseUrl; public function __construct() { $this->scheme = new Scheme(); $this->username = ''; $this->password = ''; $this->host = new NullHost(); $this->port = null; $this->path = new PathList(); $this->query = null; $this->fragment = null; $this->cannotBeABaseUrl = false; } public function __clone() { $this->scheme = clone $this->scheme; $this->host = clone $this->host; $this->path = clone $this->path; } /** * Whether or not a URL can have a username, password, or port set. * * @see https://url.spec.whatwg.org/#cannot-have-a-username-password-port */ public function cannotHaveUsernamePasswordPort(): bool { return $this->host->isNull() || $this->host->isEmpty() || $this->cannotBeABaseUrl || $this->scheme->isFile(); } /** * Whether or not the URL has a username or password. * * @see https://url.spec.whatwg.org/#include-credentials */ public function includesCredentials(): bool { return $this->username !== '' || $this->password !== ''; } /** * Computes a URL's origin. * * @see https://url.spec.whatwg.org/#origin * * @return \Rowbot\URL\Origin */ public function getOrigin(): Origin { if ($this->scheme->isBlob()) { $parser = new BasicURLParser(); $url = $parser->parse($this->path->first()->toUtf8String()); if ($url === false) { // Return a new opaque origin return Origin::createOpaqueOrigin(); } return $url->getOrigin(); } if ($this->scheme->isFile()) { // Unfortunate as it is, this is left as an exercise to the // reader. When in doubt, return a new opaque origin. return Origin::createOpaqueOrigin(); } if ($this->scheme->isSpecial()) { // Return a tuple consiting of URL's scheme, host, port, and null return Origin::createTupleOrigin( (string) $this->scheme, $this->host, $this->port, null ); } // Return a new opaque origin. return Origin::createOpaqueOrigin(); } /** * Determines whether two URLs are equal to eachother. * * @see https://url.spec.whatwg.org/#concept-url-equals * * @param self $otherUrl A URL to compare equality against. * @param bool $excludeFragment (optional) determines whether a URL's fragment should be factored into equality. */ public function isEqual(URLRecord $otherUrl, bool $excludeFragment = false): bool { return $this->serializeURL($excludeFragment) === $otherUrl->serializeURL($excludeFragment); } /** * Serializes a URL object. * * @see https://url.spec.whatwg.org/#concept-url-serializer * * @param bool $excludeFragment (optional) When specified it will exclude the URL's fragment from being serialized. */ public function serializeURL(bool $excludeFragment = false): string { $output = $this->scheme . ':'; $isNullHost = $this->host->isNull(); if (!$isNullHost) { $output .= '//'; if ($this->username !== '' || $this->password !== '') { $output .= $this->username; if ($this->password !== '') { $output .= ':' . $this->password; } $output .= '@'; } $output .= $this->host->getSerializer()->toFormattedString(); if ($this->port !== null) { $output .= ':' . $this->port; } } if ($this->cannotBeABaseUrl) { $output .= $this->path->first(); } else { $pathCount = $this->path->count(); if ($isNullHost && $pathCount > 1 && $this->path->first()->isEmpty()) { $output .= '/.'; } // Needed since implode() doesn't add a starting "/" when there is only one path segment. if ($pathCount > 0) { $output .= '/'; } $output .= $this->path; } if ($this->query !== null) { $output .= '?' . $this->query; } if (!$excludeFragment && $this->fragment !== null) { $output .= '#' . $this->fragment; } return $output; } }