Skip to content

Commit

Permalink
Making URI relative path resolution a non-strict affair. Fixes #396
Browse files Browse the repository at this point in the history
  • Loading branch information
lonnieezell committed Feb 7, 2017
1 parent 23c8dec commit 0d6d55e
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 50 deletions.
90 changes: 40 additions & 50 deletions system/HTTP/URI.php
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand Down
19 changes: 19 additions & 0 deletions tests/system/HTTP/URITest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down

0 comments on commit 0d6d55e

Please sign in to comment.