From 97994051ad1135c7fe514006ff11db6f00528c14 Mon Sep 17 00:00:00 2001 From: David Garcia Date: Sun, 8 Oct 2017 11:57:04 -0300 Subject: [PATCH] Fix realpath() based logic for windows compatiblity. --- src/JsonSchema/Uri/UriResolver.php | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/JsonSchema/Uri/UriResolver.php b/src/JsonSchema/Uri/UriResolver.php index ced7a8da..eb133f82 100644 --- a/src/JsonSchema/Uri/UriResolver.php +++ b/src/JsonSchema/Uri/UriResolver.php @@ -71,6 +71,27 @@ public function generate(array $components) return $uri; } + /** + * Custom realpath implementation to + * make results consistent in Windows and *nix + * environments. + * + * @param string $path + * The path being checked. + */ + protected function realpath($path) + { + $scheme = 'file://'; + $scheme_length = strlen($scheme); + if (strcasecmp(substr($path, 0, $scheme_length), $scheme) === 0) { + // realpath on Windows will fail to properly expand + // paths with the file:// scheme. + $path = substr($path, $scheme_length, strlen($path) - $scheme_length); + return realpath($path); + } + return realpath($path); + } + /** * {@inheritdoc} */ @@ -79,9 +100,9 @@ public function resolve($uri, $baseUri = null) // treat non-uri base as local file path if (!is_null($baseUri) && !filter_var($baseUri, \FILTER_VALIDATE_URL)) { if (is_file($baseUri)) { - $baseUri = 'file://' . realpath($baseUri); + $baseUri = 'file://' . $this->realpath($baseUri); } elseif (is_dir($baseUri)) { - $baseUri = 'file://' . realpath($baseUri) . '/'; + $baseUri = 'file://' . $this->realpath($baseUri) . '/'; } else { $baseUri = 'file://' . getcwd() . '/' . $baseUri; }