use CGI qw(:cgi :escapeHTML -nosticky); # PSGI/FastCGI/mod_perl compat
use Encode qw(decode_utf8);
use PublicInbox::Config;
-use URI::Escape qw(uri_unescape);
+use URI::Escape qw(uri_escape uri_unescape);
use Digest::SHA qw(sha1_hex);
-our $LISTNAME_RE = qr!\A(?:/.*?)?/([\w\.\-]+)!;
+our $LISTNAME_RE = qr!\A/([\w\.\-]+)!;
our $pi_config;
BEGIN {
$pi_config = PublicInbox::Config->new;
# top-level indices and feeds
if ($path_info eq "/") {
r404();
- } elsif ($path_info =~ m!$LISTNAME_RE/(?:index\.html)?\z!o) {
+ } elsif ($path_info =~ m!$LISTNAME_RE\z!o) {
+ invalid_list(\%ctx, $1) || redirect_list_index(\%ctx, $cgi);
+ } elsif ($path_info =~ m!$LISTNAME_RE(?:/|/index\.html)?\z!o) {
invalid_list(\%ctx, $1) || get_index(\%ctx, $cgi, 1);
+ } elsif ($path_info =~ m!$LISTNAME_RE/(?:all\.html)?\z!o) {
+ invalid_list(\%ctx, $1) || get_index(\%ctx, $cgi, 0);
} elsif ($path_info =~ m!$LISTNAME_RE/index\.atom\.xml\z!o) {
invalid_list(\%ctx, $1) || get_atom(\%ctx, $cgi, 1);
} elsif ($path_info =~ m!$LISTNAME_RE/all\.atom\.xml\z!o) {
} elsif ($path_info =~ m!$LISTNAME_RE/f/(\S+)\z!o) {
redirect_mid_html($cgi, $1, $2);
- } elsif ($path_info =~ m!$LISTNAME_RE\z!o) {
- invalid_list(\%ctx, $1) || redirect_list_index(\%ctx, $cgi);
} else {
r404();
}
sub r404 { r("404 Not Found") }
# simple response for errors
-sub r { [ $_[0], { 'Content-Type' => 'text/plain' }, '' ] }
+sub r { [ $_[0], { 'Content-Type' => 'text/plain' }, $_[0]."\n" ] }
# returns undef if valid, array ref response if invalid
sub invalid_list {
my $x = mid2blob($ctx);
return r404() unless $x;
- my $pfx = $cgi->self_url;
- $pfx =~ s!/m/.+\z!/!; # FIXME: this is not robust
-
+ my $pfx = "../f/" . uri_escape($ctx->{mid}) . ".html";
require PublicInbox::View;
require Email::MIME;
[ "200 OK", {'Content-Type' => 'text/html'},