ex
Fork of mbed-os-example-mbed5-blinky by
dumi_doc-master/schema/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php@44:c1d8923072ba, 2017-07-18 (annotated)
- Committer:
- TMBOY
- Date:
- Tue Jul 18 16:27:22 2017 +0800
- Revision:
- 44:c1d8923072ba
?
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| TMBOY | 44:c1d8923072ba | 1 | <?php |
| TMBOY | 44:c1d8923072ba | 2 | |
| TMBOY | 44:c1d8923072ba | 3 | /* |
| TMBOY | 44:c1d8923072ba | 4 | * This file is part of the JsonSchema package. |
| TMBOY | 44:c1d8923072ba | 5 | * |
| TMBOY | 44:c1d8923072ba | 6 | * For the full copyright and license information, please view the LICENSE |
| TMBOY | 44:c1d8923072ba | 7 | * file that was distributed with this source code. |
| TMBOY | 44:c1d8923072ba | 8 | */ |
| TMBOY | 44:c1d8923072ba | 9 | |
| TMBOY | 44:c1d8923072ba | 10 | namespace JsonSchema\Uri; |
| TMBOY | 44:c1d8923072ba | 11 | |
| TMBOY | 44:c1d8923072ba | 12 | use JsonSchema\Exception\UriResolverException; |
| TMBOY | 44:c1d8923072ba | 13 | use JsonSchema\UriResolverInterface; |
| TMBOY | 44:c1d8923072ba | 14 | |
| TMBOY | 44:c1d8923072ba | 15 | /** |
| TMBOY | 44:c1d8923072ba | 16 | * Resolves JSON Schema URIs |
| TMBOY | 44:c1d8923072ba | 17 | * |
| TMBOY | 44:c1d8923072ba | 18 | * @author Sander Coolen <sander@jibber.nl> |
| TMBOY | 44:c1d8923072ba | 19 | */ |
| TMBOY | 44:c1d8923072ba | 20 | class UriResolver implements UriResolverInterface |
| TMBOY | 44:c1d8923072ba | 21 | { |
| TMBOY | 44:c1d8923072ba | 22 | /** |
| TMBOY | 44:c1d8923072ba | 23 | * Parses a URI into five main components |
| TMBOY | 44:c1d8923072ba | 24 | * |
| TMBOY | 44:c1d8923072ba | 25 | * @param string $uri |
| TMBOY | 44:c1d8923072ba | 26 | * @return array |
| TMBOY | 44:c1d8923072ba | 27 | */ |
| TMBOY | 44:c1d8923072ba | 28 | public function parse($uri) |
| TMBOY | 44:c1d8923072ba | 29 | { |
| TMBOY | 44:c1d8923072ba | 30 | preg_match('|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|', $uri, $match); |
| TMBOY | 44:c1d8923072ba | 31 | |
| TMBOY | 44:c1d8923072ba | 32 | $components = array(); |
| TMBOY | 44:c1d8923072ba | 33 | if (5 < count($match)) { |
| TMBOY | 44:c1d8923072ba | 34 | $components = array( |
| TMBOY | 44:c1d8923072ba | 35 | 'scheme' => $match[2], |
| TMBOY | 44:c1d8923072ba | 36 | 'authority' => $match[4], |
| TMBOY | 44:c1d8923072ba | 37 | 'path' => $match[5] |
| TMBOY | 44:c1d8923072ba | 38 | ); |
| TMBOY | 44:c1d8923072ba | 39 | } |
| TMBOY | 44:c1d8923072ba | 40 | if (7 < count($match)) { |
| TMBOY | 44:c1d8923072ba | 41 | $components['query'] = $match[7]; |
| TMBOY | 44:c1d8923072ba | 42 | } |
| TMBOY | 44:c1d8923072ba | 43 | if (9 < count($match)) { |
| TMBOY | 44:c1d8923072ba | 44 | $components['fragment'] = $match[9]; |
| TMBOY | 44:c1d8923072ba | 45 | } |
| TMBOY | 44:c1d8923072ba | 46 | |
| TMBOY | 44:c1d8923072ba | 47 | return $components; |
| TMBOY | 44:c1d8923072ba | 48 | } |
| TMBOY | 44:c1d8923072ba | 49 | |
| TMBOY | 44:c1d8923072ba | 50 | /** |
| TMBOY | 44:c1d8923072ba | 51 | * Builds a URI based on n array with the main components |
| TMBOY | 44:c1d8923072ba | 52 | * |
| TMBOY | 44:c1d8923072ba | 53 | * @param array $components |
| TMBOY | 44:c1d8923072ba | 54 | * @return string |
| TMBOY | 44:c1d8923072ba | 55 | */ |
| TMBOY | 44:c1d8923072ba | 56 | public function generate(array $components) |
| TMBOY | 44:c1d8923072ba | 57 | { |
| TMBOY | 44:c1d8923072ba | 58 | $uri = $components['scheme'] . '://' |
| TMBOY | 44:c1d8923072ba | 59 | . $components['authority'] |
| TMBOY | 44:c1d8923072ba | 60 | . $components['path']; |
| TMBOY | 44:c1d8923072ba | 61 | |
| TMBOY | 44:c1d8923072ba | 62 | if (array_key_exists('query', $components)) { |
| TMBOY | 44:c1d8923072ba | 63 | $uri .= $components['query']; |
| TMBOY | 44:c1d8923072ba | 64 | } |
| TMBOY | 44:c1d8923072ba | 65 | if (array_key_exists('fragment', $components)) { |
| TMBOY | 44:c1d8923072ba | 66 | $uri .= '#' . $components['fragment']; |
| TMBOY | 44:c1d8923072ba | 67 | } |
| TMBOY | 44:c1d8923072ba | 68 | |
| TMBOY | 44:c1d8923072ba | 69 | return $uri; |
| TMBOY | 44:c1d8923072ba | 70 | } |
| TMBOY | 44:c1d8923072ba | 71 | |
| TMBOY | 44:c1d8923072ba | 72 | /** |
| TMBOY | 44:c1d8923072ba | 73 | * {@inheritdoc} |
| TMBOY | 44:c1d8923072ba | 74 | */ |
| TMBOY | 44:c1d8923072ba | 75 | public function resolve($uri, $baseUri = null) |
| TMBOY | 44:c1d8923072ba | 76 | { |
| TMBOY | 44:c1d8923072ba | 77 | if ($uri == '') { |
| TMBOY | 44:c1d8923072ba | 78 | return $baseUri; |
| TMBOY | 44:c1d8923072ba | 79 | } |
| TMBOY | 44:c1d8923072ba | 80 | |
| TMBOY | 44:c1d8923072ba | 81 | $components = $this->parse($uri); |
| TMBOY | 44:c1d8923072ba | 82 | $path = $components['path']; |
| TMBOY | 44:c1d8923072ba | 83 | |
| TMBOY | 44:c1d8923072ba | 84 | if (! empty($components['scheme'])) { |
| TMBOY | 44:c1d8923072ba | 85 | return $uri; |
| TMBOY | 44:c1d8923072ba | 86 | } |
| TMBOY | 44:c1d8923072ba | 87 | $baseComponents = $this->parse($baseUri); |
| TMBOY | 44:c1d8923072ba | 88 | $basePath = $baseComponents['path']; |
| TMBOY | 44:c1d8923072ba | 89 | |
| TMBOY | 44:c1d8923072ba | 90 | $baseComponents['path'] = self::combineRelativePathWithBasePath($path, $basePath); |
| TMBOY | 44:c1d8923072ba | 91 | if (isset($components['fragment'])) { |
| TMBOY | 44:c1d8923072ba | 92 | $baseComponents['fragment'] = $components['fragment']; |
| TMBOY | 44:c1d8923072ba | 93 | } |
| TMBOY | 44:c1d8923072ba | 94 | |
| TMBOY | 44:c1d8923072ba | 95 | return $this->generate($baseComponents); |
| TMBOY | 44:c1d8923072ba | 96 | } |
| TMBOY | 44:c1d8923072ba | 97 | |
| TMBOY | 44:c1d8923072ba | 98 | /** |
| TMBOY | 44:c1d8923072ba | 99 | * Tries to glue a relative path onto an absolute one |
| TMBOY | 44:c1d8923072ba | 100 | * |
| TMBOY | 44:c1d8923072ba | 101 | * @param string $relativePath |
| TMBOY | 44:c1d8923072ba | 102 | * @param string $basePath |
| TMBOY | 44:c1d8923072ba | 103 | * @return string Merged path |
| TMBOY | 44:c1d8923072ba | 104 | * @throws UriResolverException |
| TMBOY | 44:c1d8923072ba | 105 | */ |
| TMBOY | 44:c1d8923072ba | 106 | public static function combineRelativePathWithBasePath($relativePath, $basePath) |
| TMBOY | 44:c1d8923072ba | 107 | { |
| TMBOY | 44:c1d8923072ba | 108 | $relativePath = self::normalizePath($relativePath); |
| TMBOY | 44:c1d8923072ba | 109 | if ($relativePath == '') { |
| TMBOY | 44:c1d8923072ba | 110 | return $basePath; |
| TMBOY | 44:c1d8923072ba | 111 | } |
| TMBOY | 44:c1d8923072ba | 112 | if ($relativePath{0} == '/') { |
| TMBOY | 44:c1d8923072ba | 113 | return $relativePath; |
| TMBOY | 44:c1d8923072ba | 114 | } |
| TMBOY | 44:c1d8923072ba | 115 | |
| TMBOY | 44:c1d8923072ba | 116 | $basePathSegments = explode('/', $basePath); |
| TMBOY | 44:c1d8923072ba | 117 | |
| TMBOY | 44:c1d8923072ba | 118 | preg_match('|^/?(\.\./(?:\./)*)*|', $relativePath, $match); |
| TMBOY | 44:c1d8923072ba | 119 | $numLevelUp = strlen($match[0]) /3 + 1; |
| TMBOY | 44:c1d8923072ba | 120 | if ($numLevelUp >= count($basePathSegments)) { |
| TMBOY | 44:c1d8923072ba | 121 | throw new UriResolverException(sprintf("Unable to resolve URI '%s' from base '%s'", $relativePath, $basePath)); |
| TMBOY | 44:c1d8923072ba | 122 | } |
| TMBOY | 44:c1d8923072ba | 123 | |
| TMBOY | 44:c1d8923072ba | 124 | $basePathSegments = array_slice($basePathSegments, 0, -$numLevelUp); |
| TMBOY | 44:c1d8923072ba | 125 | $path = preg_replace('|^/?(\.\./(\./)*)*|', '', $relativePath); |
| TMBOY | 44:c1d8923072ba | 126 | |
| TMBOY | 44:c1d8923072ba | 127 | return implode('/', $basePathSegments) . '/' . $path; |
| TMBOY | 44:c1d8923072ba | 128 | } |
| TMBOY | 44:c1d8923072ba | 129 | |
| TMBOY | 44:c1d8923072ba | 130 | /** |
| TMBOY | 44:c1d8923072ba | 131 | * Normalizes a URI path component by removing dot-slash and double slashes |
| TMBOY | 44:c1d8923072ba | 132 | * |
| TMBOY | 44:c1d8923072ba | 133 | * @param string $path |
| TMBOY | 44:c1d8923072ba | 134 | * @return string |
| TMBOY | 44:c1d8923072ba | 135 | */ |
| TMBOY | 44:c1d8923072ba | 136 | private static function normalizePath($path) |
| TMBOY | 44:c1d8923072ba | 137 | { |
| TMBOY | 44:c1d8923072ba | 138 | $path = preg_replace('|((?<!\.)\./)*|', '', $path); |
| TMBOY | 44:c1d8923072ba | 139 | $path = preg_replace('|//|', '/', $path); |
| TMBOY | 44:c1d8923072ba | 140 | |
| TMBOY | 44:c1d8923072ba | 141 | return $path; |
| TMBOY | 44:c1d8923072ba | 142 | } |
| TMBOY | 44:c1d8923072ba | 143 | |
| TMBOY | 44:c1d8923072ba | 144 | /** |
| TMBOY | 44:c1d8923072ba | 145 | * @param string $uri |
| TMBOY | 44:c1d8923072ba | 146 | * @return boolean |
| TMBOY | 44:c1d8923072ba | 147 | */ |
| TMBOY | 44:c1d8923072ba | 148 | public function isValid($uri) |
| TMBOY | 44:c1d8923072ba | 149 | { |
| TMBOY | 44:c1d8923072ba | 150 | $components = $this->parse($uri); |
| TMBOY | 44:c1d8923072ba | 151 | |
| TMBOY | 44:c1d8923072ba | 152 | return !empty($components); |
| TMBOY | 44:c1d8923072ba | 153 | } |
| TMBOY | 44:c1d8923072ba | 154 | } |
