diff options
author | Christian Weiske <[email protected]> | 2010-11-10 23:09:03 +0100 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2010-11-11 09:44:05 +0300 |
commit | f679105cb2adc6de3e41527830fa0bfde36324d1 (patch) | |
tree | 0b8d3afbb9419559fedb5f00143eceb106ce4d68 | |
parent | 24eb4c780f531363e90fe2d8248d50189dcb6b38 (diff) |
add unit tests for rewrite_relative_url and fix a number of bugs in it
-rw-r--r-- | functions.php | 19 | ||||
-rw-r--r-- | tests/FunctionsTest.php | 63 |
2 files changed, 80 insertions, 2 deletions
diff --git a/functions.php b/functions.php index 96fa19224..a52dafddd 100644 --- a/functions.php +++ b/functions.php @@ -7074,6 +7074,14 @@ return $parts['scheme'] . "://" . $parts['host'] . $parts['path']; } + /** + * Converts a (possibly) relative URL to a absolute one. + * + * @param string $url Base URL (i.e. from where the document is) + * @param string $rel_url Possibly relative URL in the document + * + * @return string Absolute URL + */ function rewrite_relative_url($url, $rel_url) { if (strpos($rel_url, "://") !== false) { return $rel_url; @@ -7086,8 +7094,15 @@ } else { $parts = parse_url($url); - - $parts['path'] = dirname($parts['path']) . "/$rel_url"; + if (!isset($parts['path'])) { + $parts['path'] = '/'; + } + $dir = $parts['path']; + if (substr($dir, -1) !== '/') { + $dir = dirname($parts['path']); + $dir !== '/' && $dir .= '/'; + } + $parts['path'] = $dir . $rel_url; return build_url($parts); } diff --git a/tests/FunctionsTest.php b/tests/FunctionsTest.php index 163e985d0..f1bfa7451 100644 --- a/tests/FunctionsTest.php +++ b/tests/FunctionsTest.php @@ -177,6 +177,69 @@ HTM ); $this->assertFalse(url_is_html($this->tmpFile)); } + + + + /** + * Test rewrite_relative_url() with a relative path + */ + public function testRewriteRelativeUrlRelative() + { + $this->assertEquals( + 'http://tt-rss.org/foo/bar', + rewrite_relative_url('http://tt-rss.org', 'foo/bar') + ); + $this->assertEquals( + 'http://tt-rss.org/foo/bar', + rewrite_relative_url('http://tt-rss.org/', 'foo/bar') + ); + $this->assertEquals( + 'http://tt-rss.org/bar', + rewrite_relative_url('http://tt-rss.org/foo', 'bar') + ); + $this->assertEquals( + 'http://tt-rss.org/foo/bar', + rewrite_relative_url('http://tt-rss.org/foo/', 'bar') + ); + $this->assertEquals( + 'http://tt-rss.org/f/o/bar', + rewrite_relative_url('http://tt-rss.org/f/o/o', 'bar') + ); + $this->assertEquals( + 'http://tt-rss.org/f/o/o/bar', + rewrite_relative_url('http://tt-rss.org/f/o/o/', 'bar') + ); + } + + /** + * Test rewrite_relative_url() with an absolute path + */ + public function testRewriteRelativeUrlAbsolutePath() + { + $this->assertEquals( + 'http://tt-rss.org/bar/', + rewrite_relative_url('http://tt-rss.org/foo/', '/bar/') + ); + $this->assertEquals( + 'http://tt-rss.org/bar/', + rewrite_relative_url('http://tt-rss.org/so/what/is/next', '/bar/') + ); + $this->assertEquals( + 'http://tt-rss.org/bar/', + rewrite_relative_url('http://tt-rss.org/so/what/is/next/', '/bar/') + ); + } + + /** + * Test rewrite_relative_url() with an absolute URL + */ + public function testRewriteRelativeUrlAbsoluteUrl() + { + $this->assertEquals( + 'http://example.org/bar/', + rewrite_relative_url('http://tt-rss.org/foo/', 'http://example.org/bar/') + ); + } } ?>
\ No newline at end of file |