# like format_sanitized_subject in git.git pretty.c with '%f' format string
sub to_filename ($) {
- my ($s, undef) = split(/\n/, $_[0]);
+ my $s = (split(/\n/, $_[0]))[0] // return; # empty string => undef
$s =~ s/[^A-Za-z0-9_\.]+/-/g;
$s =~ tr/././s;
$s =~ s/[\.\-]+\z//;
$s =~ s/\A[\.\-]+//;
- $s
+ $s eq '' ? undef : $s;
}
# convert a filename (or any string) to HTML attribute
sub res_hdr ($$) {
my ($ctx, $subject) = @_;
- my $fn = $subject // 'no-subject';
+ my $fn = $subject // '';
$fn =~ s/^re:\s+//i;
- $fn = $fn eq '' ? 'no-subject' : to_filename($fn);
+ $fn = to_filename($fn) // 'no-subject';
my @hdr = ('Content-Type');
if ($ctx->{-inbox}->{obfuscate}) {
# obfuscation is stupid, but maybe scrapers are, too...
$self->{cb} = $cb;
$self->{base_url} = $self->{-inbox}->base_url($self->{env});
$self->{gz} = PublicInbox::GzipFilter::gzip_or_die();
- $fn = to_filename($fn // 'no-subject');
- $fn = 'no-subject' if $fn eq '';
+ $fn = to_filename($fn // '') // 'no-subject';
# http://www.iana.org/assignments/media-types/application/gzip
bless $self, __PACKAGE__;
my $res_hdr = [ 'Content-Type' => 'application/gzip',
is($html, $exp, 'only obfuscated relevant addresses');
-is('foo-bar', PublicInbox::Hval::to_filename('foo bar '),
+is(PublicInbox::Hval::to_filename('foo bar '), 'foo-bar',
'to_filename has no trailing -');
-is('foo-bar', PublicInbox::Hval::to_filename("foo bar\nanother line\n"),
+is(PublicInbox::Hval::to_filename("foo bar\nanother line\n"), 'foo-bar',
'to_filename has no repeated -, and nothing past LF');
-is('foo.bar', PublicInbox::Hval::to_filename("foo....bar"),
+is(PublicInbox::Hval::to_filename("foo....bar"), 'foo.bar',
'to_filename squeezes -');
+is(PublicInbox::Hval::to_filename(''), undef, 'empty string returns undef');
+
my $s = "\0\x07\n";
PublicInbox::Hval::src_escape($s);
is($s, "\\0\\a\n", 'src_escape works as intended');