class UriResolver
Same name in this branch
- 11.1.x vendor/guzzlehttp/psr7/src/UriResolver.php \GuzzleHttp\Psr7\UriResolver
- 11.1.x vendor/symfony/dom-crawler/UriResolver.php \Symfony\Component\DomCrawler\UriResolver
Resolves JSON Schema URIs
@author Sander Coolen <sander@jibber.nl>
Hierarchy
- class \JsonSchema\Uri\UriResolver implements \JsonSchema\UriResolverInterface
Expanded class hierarchy of UriResolver
2 files declare their use of UriResolver
- SchemaStorage.php in vendor/
justinrainbow/ json-schema/ src/ JsonSchema/ SchemaStorage.php - UndefinedConstraint.php in vendor/
justinrainbow/ json-schema/ src/ JsonSchema/ Constraints/ UndefinedConstraint.php
File
-
vendor/
justinrainbow/ json-schema/ src/ JsonSchema/ Uri/ UriResolver.php, line 20
Namespace
JsonSchema\UriView source
class UriResolver implements UriResolverInterface {
/**
* Parses a URI into five main components
*
* @param string $uri
*
* @return array
*/
public function parse($uri) {
preg_match('|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?|', $uri, $match);
$components = array();
if (5 < count($match)) {
$components = array(
'scheme' => $match[2],
'authority' => $match[4],
'path' => $match[5],
);
}
if (7 < count($match)) {
$components['query'] = $match[7];
}
if (9 < count($match)) {
$components['fragment'] = $match[9];
}
return $components;
}
/**
* Builds a URI based on n array with the main components
*
* @param array $components
*
* @return string
*/
public function generate(array $components) {
$uri = $components['scheme'] . '://' . $components['authority'] . $components['path'];
if (array_key_exists('query', $components) && strlen($components['query'])) {
$uri .= '?' . $components['query'];
}
if (array_key_exists('fragment', $components)) {
$uri .= '#' . $components['fragment'];
}
return $uri;
}
/**
* {@inheritdoc}
*/
public function resolve($uri, $baseUri = null) {
// treat non-uri base as local file path
if (!is_null($baseUri) && !filter_var($baseUri, \FILTER_VALIDATE_URL) && !preg_match('|^[^/]+://|u', $baseUri)) {
if (is_file($baseUri)) {
$baseUri = 'file://' . realpath($baseUri);
}
elseif (is_dir($baseUri)) {
$baseUri = 'file://' . realpath($baseUri) . '/';
}
else {
$baseUri = 'file://' . getcwd() . '/' . $baseUri;
}
}
if ($uri == '') {
return $baseUri;
}
$components = $this->parse($uri);
$path = $components['path'];
if (!empty($components['scheme'])) {
return $uri;
}
$baseComponents = $this->parse($baseUri);
$basePath = $baseComponents['path'];
$baseComponents['path'] = self::combineRelativePathWithBasePath($path, $basePath);
if (isset($components['fragment'])) {
$baseComponents['fragment'] = $components['fragment'];
}
return $this->generate($baseComponents);
}
/**
* Tries to glue a relative path onto an absolute one
*
* @param string $relativePath
* @param string $basePath
*
* @throws UriResolverException
*
* @return string Merged path
*/
public static function combineRelativePathWithBasePath($relativePath, $basePath) {
$relativePath = self::normalizePath($relativePath);
if ($relativePath == '') {
return $basePath;
}
if ($relativePath[0] == '/') {
return $relativePath;
}
$basePathSegments = explode('/', $basePath);
preg_match('|^/?(\\.\\./(?:\\./)*)*|', $relativePath, $match);
$numLevelUp = strlen($match[0]) / 3 + 1;
if ($numLevelUp >= count($basePathSegments)) {
throw new UriResolverException(sprintf("Unable to resolve URI '%s' from base '%s'", $relativePath, $basePath));
}
$basePathSegments = array_slice($basePathSegments, 0, -$numLevelUp);
$path = preg_replace('|^/?(\\.\\./(\\./)*)*|', '', $relativePath);
return implode('/', $basePathSegments) . '/' . $path;
}
/**
* Normalizes a URI path component by removing dot-slash and double slashes
*
* @param string $path
*
* @return string
*/
private static function normalizePath($path) {
$path = preg_replace('|((?<!\\.)\\./)*|', '', $path);
$path = preg_replace('|//|', '/', $path);
return $path;
}
/**
* @param string $uri
*
* @return bool
*/
public function isValid($uri) {
$components = $this->parse($uri);
return !empty($components);
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overriden Title |
---|---|---|---|---|
UriResolver::combineRelativePathWithBasePath | public static | function | Tries to glue a relative path onto an absolute one | |
UriResolver::generate | public | function | Builds a URI based on n array with the main components | |
UriResolver::isValid | public | function | ||
UriResolver::normalizePath | private static | function | Normalizes a URI path component by removing dot-slash and double slashes | |
UriResolver::parse | public | function | Parses a URI into five main components | |
UriResolver::resolve | public | function | Resolves a URI | Overrides UriResolverInterface::resolve |