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;
} 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);
}
);
$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