From 0d6d55eee25367a8f939b63538ba2dbc8574118b Mon Sep 17 00:00:00 2001 From: Lonnie Ezell Date: Mon, 6 Feb 2017 23:16:06 -0600 Subject: [PATCH] Making URI relative path resolution a non-strict affair. Fixes #396 --- system/HTTP/URI.php | 90 ++++++++++++++++------------------- tests/system/HTTP/URITest.php | 19 ++++++++ 2 files changed, 59 insertions(+), 50 deletions(-) diff --git a/system/HTTP/URI.php b/system/HTTP/URI.php index 1ce5ac87e44b..83442833858b 100644 --- a/system/HTTP/URI.php +++ b/system/HTTP/URI.php @@ -995,56 +995,46 @@ public function resolveRelativeURI(string $uri) $transformed = clone $relative; - // 5.2.2 Transform References - if (! empty($relative->getScheme())) - { - $transformed->setScheme($relative->getScheme()) - ->setAuthority($relative->getAuthority()) - ->setPath($relative->getPath()) - ->setQuery($relative->getQuery()); - } - else - { - if (! empty($relative->getAuthority())) - { - $transformed->setAuthority($relative->getAuthority()) - ->setPath($relative->getPath()) - ->setQuery($relative->getQuery()); - } - else - { - if ($relative->getPath() == '') - { - $transformed->setPath($this->getPath()); - - if (! is_null($relative->getQuery())) - { - $transformed->setQuery($relative->getQuery()); - } - else - { - $transformed->setQuery($this->getQuery()); - } - } - else - { - if (substr($relative->getPath(), 0, 1) == '/') - { - $transformed->setPath($relative->getPath()); - } - else - { - $transformed->setPath($this->mergePaths($this, $relative)); - } - - $transformed->setQuery($relative->getQuery()); - } - - $transformed->setAuthority($this->getAuthority()); - } - - $transformed->setScheme($this->getScheme()); - } + // 5.2.2 Transform References in a non-strict method (no scheme) + if (! empty($relative->getAuthority())) + { + $transformed->setAuthority($relative->getAuthority()) + ->setPath($relative->getPath()) + ->setQuery($relative->getQuery()); + } + else + { + if ($relative->getPath() == '') + { + $transformed->setPath($this->getPath()); + + if (! is_null($relative->getQuery())) + { + $transformed->setQuery($relative->getQuery()); + } + else + { + $transformed->setQuery($this->getQuery()); + } + } + else + { + if (substr($relative->getPath(), 0, 1) == '/') + { + $transformed->setPath($relative->getPath()); + } + else + { + $transformed->setPath($this->mergePaths($this, $relative)); + } + + $transformed->setQuery($relative->getQuery()); + } + + $transformed->setAuthority($this->getAuthority()); + } + + $transformed->setScheme($this->getScheme()); $transformed->setFragment($relative->getFragment()); diff --git a/tests/system/HTTP/URITest.php b/tests/system/HTTP/URITest.php index 76f6b365805a..6231bd54ea8e 100644 --- a/tests/system/HTTP/URITest.php +++ b/tests/system/HTTP/URITest.php @@ -440,6 +440,25 @@ public function testResolveRelativeURI($rel, $expected) //-------------------------------------------------------------------- + /** + * @dataProvider defaultResolutions + * @group single + */ + public function testResolveRelativeURIHTTPS($rel, $expected) + { + $base = 'https://a/b/c/d'; + + $expected = str_replace('http:', 'https:', $expected); + + $uri = new URI($base); + + $new = $uri->resolveRelativeURI($rel); + + $this->assertEquals($expected, (string) $new); + } + + //-------------------------------------------------------------------- + public function testAddQueryVar() { $base = 'http://example.com/foo';