X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FWWW.pm;h=508abf73856c3daf08614a9342b91670280cad5f;hb=f76f265a851944b5dedcc3be5f3b5224b6ebda89;hp=11b540276d8c57a96e6c0335493314d7049819fb;hpb=43238d3688a51d98ce47151173aa7971e231a3bb;p=public-inbox.git diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index 11b54027..508abf73 100644 --- a/lib/PublicInbox/WWW.pm +++ b/lib/PublicInbox/WWW.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2014, Eric Wong and all contributors +# Copyright (C) 2014-2015 all contributors # License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) # # We focus on the lowest common denominators here: @@ -17,12 +17,13 @@ use constant SSOMA_URL => 'http://ssoma.public-inbox.org/'; use constant PI_URL => 'http://public-inbox.org/'; our $LISTNAME_RE = qr!\A/([\w\.\-]+)!; our $MID_RE = qr!([^/]+)!; +our $END_RE = qr!(f/|T/|t/|t\.mbox(?:\.gz)?|t\.atom|raw|)!; our $pi_config; sub run { my ($cgi, $method) = @_; $pi_config ||= PublicInbox::Config->new; - my %ctx = (cgi => $cgi, pi_config => $pi_config); + my $ctx = { cgi => $cgi, pi_config => $pi_config }; if ($method !~ /\AGET|HEAD\z/) { return r(405, 'Method Not Allowed'); } @@ -32,40 +33,25 @@ sub run { if ($path_info eq '/') { r404(); } elsif ($path_info =~ m!$LISTNAME_RE\z!o) { - invalid_list(\%ctx, $1) || r301(\%ctx, $1); + invalid_list($ctx, $1) || r301($ctx, $1); } elsif ($path_info =~ m!$LISTNAME_RE(?:/|/index\.html)?\z!o) { - invalid_list(\%ctx, $1) || get_index(\%ctx); + invalid_list($ctx, $1) || get_index($ctx); } elsif ($path_info =~ m!$LISTNAME_RE/(?:atom\.xml|new\.atom)\z!o) { - invalid_list(\%ctx, $1) || get_atom(\%ctx); + invalid_list($ctx, $1) || get_atom($ctx); - # thread display - } elsif ($path_info =~ m!$LISTNAME_RE/$MID_RE/t/\z!o) { - invalid_list_mid(\%ctx, $1, $2) || get_thread(\%ctx); - } elsif ($path_info =~ m!$LISTNAME_RE/$MID_RE/t\.mbox(\.gz)?\z!o) { - my $sfx = $3; - invalid_list_mid(\%ctx, $1, $2) || get_thread_mbox(\%ctx, $sfx); - } elsif ($path_info =~ m!$LISTNAME_RE/$MID_RE/t\.atom\z!o) { - invalid_list_mid(\%ctx, $1, $2) || get_thread_atom(\%ctx); - } elsif ($path_info =~ m!$LISTNAME_RE/$MID_RE/T/\z!o) { - $ctx{flat} = 1; - invalid_list_mid(\%ctx, $1, $2) || get_thread(\%ctx); - - # single-message pages - } elsif ($path_info =~ m!$LISTNAME_RE/$MID_RE/\z!o) { - invalid_list_mid(\%ctx, $1, $2) || get_mid_html(\%ctx); - } elsif ($path_info =~ m!$LISTNAME_RE/$MID_RE/raw\z!o) { - invalid_list_mid(\%ctx, $1, $2) || get_mid_txt(\%ctx); + } elsif ($path_info =~ m!$LISTNAME_RE/$MID_RE/$END_RE\z!o) { + msg_page($ctx, $1, $2, $3); - # full-message page - } elsif ($path_info =~ m!$LISTNAME_RE/$MID_RE/f/\z!o) { - invalid_list_mid(\%ctx, $1, $2) || get_full_html(\%ctx); + # in case people leave off the trailing slash: + } elsif ($path_info =~ m!$LISTNAME_RE/$MID_RE/(f|T|t)\z!o) { + r301($ctx, $1, $2, $3 eq 't' ? 't/#u' : $3); # convenience redirects order matters } elsif ($path_info =~ m!$LISTNAME_RE/([^/]{2,})\z!o) { - r301(\%ctx, $1, $2); + r301($ctx, $1, $2); } else { - legacy_redirects(\%ctx, $path_info); + legacy_redirects($ctx, $path_info); } } @@ -81,6 +67,7 @@ sub preload { eval { require PublicInbox::Search; + require PublicInbox::SearchView; require PublicInbox::Mbox; require IO::Compress::Gzip; }; @@ -92,6 +79,7 @@ sub r404 { my ($ctx) = @_; if ($ctx && $ctx->{mid}) { require PublicInbox::ExtMsg; + searcher($ctx); return PublicInbox::ExtMsg::ext_msg($ctx); } r(404, 'Not Found'); @@ -142,8 +130,14 @@ sub get_index { my ($ctx) = @_; require PublicInbox::Feed; my $srch = searcher($ctx); + my $q = $ctx->{cgi}->param('q'); footer($ctx); - PublicInbox::Feed::generate_html_index($ctx); + if (defined $q) { + require PublicInbox::SearchView; + PublicInbox::SearchView::sres_top_html($ctx, $q); + } else { + PublicInbox::Feed::generate_html_index($ctx); + } } # just returns a string ref for the blob in the current ctx @@ -203,10 +197,11 @@ sub get_full_html { # /$LISTNAME/$MESSAGE_ID/t/ sub get_thread { - my ($ctx) = @_; + my ($ctx, $flat) = @_; my $srch = searcher($ctx) or return need_search($ctx); require PublicInbox::View; my $foot = footer($ctx); + $ctx->{flat} = $flat; PublicInbox::View::thread_html($ctx, $foot, $srch); } @@ -366,6 +361,14 @@ sub legacy_redirects { } elsif ($path_info =~ m!$LISTNAME_RE/f/(\S+)\z!o) { r301($ctx, $1, $2, 'f/'); + # some Message-IDs have slashes in them and the HTTP server + # may try to be clever and unescape them :< + } elsif ($path_info =~ m!$LISTNAME_RE/(\S+/\S+)/$END_RE\z!o) { + msg_page($ctx, $1, $2, $3); + + # in case people leave off the trailing slash: + } elsif ($path_info =~ m!$LISTNAME_RE/(\S+/\S+)/(f|T|t)\z!o) { + r301($ctx, $1, $2, $3 eq 't' ? 't/#u' : $3); } else { r404(); } @@ -390,4 +393,19 @@ sub r301 { [ "Redirecting to $url\n" ] ] } +sub msg_page { + my ($ctx, $list, $mid, $e) = @_; + unless (invalid_list_mid($ctx, $list, $mid)) { + '' eq $e and return get_mid_html($ctx); + 't/' eq $e and return get_thread($ctx); + 't.atom' eq $e and return get_thread_atom($ctx); + 't.mbox' eq $e and return get_thread_mbox($ctx); + 't.mbox.gz' eq $e and return get_thread_mbox($ctx, '.gz'); + 'T/' eq $e and return get_thread($ctx, 1); + 'raw' eq $e and return get_mid_txt($ctx); + 'f/' eq $e and return get_full_html($ctx); + } + r404($ctx); +} + 1;