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