]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
Compose relative URLs in RSS feeds correctly
authorSimon McVittie <smcv@debian.org>
Thu, 21 Jan 2016 08:40:14 +0000 (08:40 +0000)
committerSimon McVittie <smcv@debian.org>
Thu, 21 Jan 2016 08:40:14 +0000 (08:40 +0000)
If the relative link from the (page generating the) RSS to the target
would start with "./" or "../", just concatenating it with the URL to
the directory containing the RSS is not sufficient. Go via
URI::new_abs to fix this.

IkiWiki/Plugin/inline.pm
doc/bugs/rss_output_relative_links.mdwn
t/inline.t

index 5ea5f35af64118581dd434efc6e4cdf61bed55b4..c3895d9824a0efbca3f8f339b5a4d068434cfe51 100644 (file)
@@ -613,7 +613,7 @@ sub absolute_urls ($$) {
                                        $v=$baseurl.$v; # anchor
                                }
                                elsif ($dv=~/^(?!\w+:)[^\/]/) {
-                                       $v=$url.$v; # relative url
+                                       $v=URI->new_abs($v, $url)->canonical; # relative url
                                }
                                elsif ($dv=~/^\//) {
                                        if (! defined $urltop) {
index ff607cbb361e9e82422d94d095029c0d04a18c8b..7a2e4d12bb3170f14fc2efdc9984eab23124ad2e 100644 (file)
@@ -1,3 +1,5 @@
 RSS output contains relative links. Ie. 
 http://kitenet.net/~joey/blog/index.rss contains a link to 
 http://kitenet.net/~joey/blog/../blog.html
+
+> Finally [[done]] for the first release of 2016. --[[smcv]]
index 859e1701ac211eaff100496b13d53b5c20ce6852..8c0f1c35ab1f4c79f97e0669cdea4ad9cacb2111 100755 (executable)
@@ -46,6 +46,9 @@ write_old_file("antagonists.mdwn",
 # using old spelling of "limit" ("show") to verify backwards compat
 write_old_file("enemies.mdwn",
        '[[!inline pages="enemies/*" postform=no rootpage=enemies sort=title reverse=yes show=2]]');
+# to test correct processing of ../
+write_old_file("blah/blah/enemies.mdwn",
+       '[[!inline pages="enemies/*" postform=no rootpage=enemies sort=title reverse=yes show=2]]');
 foreach my $page (qw(protagonists/shepard protagonists/link
                antagonists/saren antagonists/ganondorf
                friends/garrus friends/liara friends/midna friends/telma
@@ -53,6 +56,9 @@ foreach my $page (qw(protagonists/shepard protagonists/link
                enemies/zant)) {
        write_old_file("$page.mdwn", "this page is {$page}");
 }
+# test cross-linking between pages as rendered in RSS
+write_old_file("enemies/zant.mdwn", "this page is {enemies/zant}\n\n".
+       "Zant hates [[friends/Midna]].");
 
 ok(! system(@command));
 ok(! system(@command, "--refresh"));
@@ -81,4 +87,18 @@ like($blob, qr[this page is \{enemies/zant}.*this page is \{enemies/rachni}]s,
 unlike($blob, qr{enemies/(?:benezia|geth)},
        'pages excluded by show should not be present');
 
+$blob = readfile("t/tmp/out/enemies.rss");
+like($blob, qr[this page is \{enemies/zant}.*this page is \{enemies/rachni}]s,
+       'first two pages in reversed sort order are present');
+like($blob,
+       qr[Zant hates &lt;a href=(?:['"]|&quot;)http://example\.com/friends/midna.html(?:['"]|&quot;)&gt;Midna&lt;/a&gt;]s,
+       'link is correctly relative');
+
+$blob = readfile("t/tmp/out/blah/blah/enemies.rss");
+like($blob, qr[this page is \{enemies/zant}.*this page is \{enemies/rachni}]s,
+       'first two pages in reversed sort order are present');
+like($blob,
+       qr[Zant hates &lt;a href=(?:['"]|&quot;)http://example\.com/friends/midna.html(?:['"]|&quot;)&gt;Midna&lt;/a&gt;]s,
+       'link is correctly relative');
+
 done_testing;