Compose relative URLs in RSS feeds correctly

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.
master
Simon McVittie 2016-01-21 08:40:14 +00:00
parent 816c856a46
commit 7aca0d40a3
3 changed files with 23 additions and 1 deletions

View File

@ -613,7 +613,7 @@ sub absolute_urls ($$) {
$v=$baseurl.$v; # anchor $v=$baseurl.$v; # anchor
} }
elsif ($dv=~/^(?!\w+:)[^\/]/) { elsif ($dv=~/^(?!\w+:)[^\/]/) {
$v=$url.$v; # relative url $v=URI->new_abs($v, $url)->canonical; # relative url
} }
elsif ($dv=~/^\//) { elsif ($dv=~/^\//) {
if (! defined $urltop) { if (! defined $urltop) {

View File

@ -1,3 +1,5 @@
RSS output contains relative links. Ie. RSS output contains relative links. Ie.
http://kitenet.net/~joey/blog/index.rss contains a link to http://kitenet.net/~joey/blog/index.rss contains a link to
http://kitenet.net/~joey/blog/../blog.html http://kitenet.net/~joey/blog/../blog.html
> Finally [[done]] for the first release of 2016. --[[smcv]]

View File

@ -46,6 +46,9 @@ write_old_file("antagonists.mdwn",
# using old spelling of "limit" ("show") to verify backwards compat # using old spelling of "limit" ("show") to verify backwards compat
write_old_file("enemies.mdwn", write_old_file("enemies.mdwn",
'[[!inline pages="enemies/*" postform=no rootpage=enemies sort=title reverse=yes show=2]]'); '[[!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 foreach my $page (qw(protagonists/shepard protagonists/link
antagonists/saren antagonists/ganondorf antagonists/saren antagonists/ganondorf
friends/garrus friends/liara friends/midna friends/telma friends/garrus friends/liara friends/midna friends/telma
@ -53,6 +56,9 @@ foreach my $page (qw(protagonists/shepard protagonists/link
enemies/zant)) { enemies/zant)) {
write_old_file("$page.mdwn", "this page is {$page}"); 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));
ok(! system(@command, "--refresh")); 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)}, unlike($blob, qr{enemies/(?:benezia|geth)},
'pages excluded by show should not be present'); '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 <a href=(?:['"]|")http://example\.com/friends/midna.html(?:['"]|")>Midna</a>]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 <a href=(?:['"]|")http://example\.com/friends/midna.html(?:['"]|")>Midna</a>]s,
'link is correctly relative');
done_testing; done_testing;