]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
hval: use File::Spec to make relative paths for href
authorEric Wong <e@80x24.org>
Tue, 28 Nov 2023 14:56:20 +0000 (14:56 +0000)
committerEric Wong <e@80x24.org>
Wed, 29 Nov 2023 02:13:21 +0000 (02:13 +0000)
File::Spec->abs2rel doesn't touch the filesystem at all when
given an absolute base arg ($env->{PATH_INFO}), so we can rely
on it to generate relative links that work with the `mount'
from Plack::Builder and also people running `wget -r' mirrors.

lib/PublicInbox/Hval.pm

index e9b9ae649c545a23cb07ff3b23c12c46bca70ac4..b804254a93be9cce6186c293a15604c0de383fcb 100644 (file)
@@ -13,6 +13,7 @@ our @EXPORT_OK = qw/ascii_html obfuscate_addrs to_filename src_escape
                to_attr prurl mid_href fmt_ts ts2str utf8_maybe/;
 use POSIX qw(strftime);
 my $enc_ascii = find_encoding('us-ascii');
+use File::Spec;
 
 # safe-ish acceptable filename pattern for portability
 our $FN = '[a-zA-Z0-9][a-zA-Z0-9_\-\.]+[a-zA-Z0-9]'; # needs \z anchor
@@ -69,7 +70,16 @@ sub prurl ($$) {
                $u = $host_match[0] // $u->[0];
                # fall through to below:
        }
-       index($u, '//') == 0 ? "$env->{'psgi.url_scheme'}:$u" : $u;
+       my $dslash = index($u, '//');
+       if ($dslash == 0) {
+               "$env->{'psgi.url_scheme'}:$u"
+       } elsif ($dslash < 0 && substr($u, 0, 1) ne '/' &&
+                       substr(my $path = $env->{PATH_INFO}, 0, 1) eq '/') {
+               # this won't touch the FS at all:
+               File::Spec->abs2rel("/$u", $path);
+       } else {
+               $u;
+       }
 }
 
 # for misguided people who believe in this stuff, give them a