ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
TMBOY
Date:
Tue Jul 18 16:27:22 2017 +0800
Revision:
44:c1d8923072ba
?

Who changed what in which revision?

UserRevisionLine numberNew 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 }