]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WWW.pm
Merge remote-tracking branch 'origin/xap-optional' into master
[public-inbox.git] / lib / PublicInbox / WWW.pm
index 268c5b8c7de8e49872cb6333b869b5f3c3170fdb..b6f18f8d8140e130afdc637b4af277b10dc446c2 100644 (file)
@@ -59,17 +59,18 @@ sub call {
        my $ctx = { env => $env, www => $self };
 
        # we don't care about multi-value
-       my %qp = map {
+       %{$ctx->{qp}} = map {
                utf8::decode($_);
-               my ($k, $v) = split('=', uri_unescape($_), 2);
-               $v = '' unless defined $v;
-               $v =~ tr/+/ /;
-               ($k, $v)
+               tr/+/ /;
+               my ($k, $v) = split('=', $_, 2);
+               $v = uri_unescape($v // '');
+               # none of the keys we care about will need escaping
+               $k => $v;
        } split(/[&;]+/, $env->{QUERY_STRING});
-       $ctx->{qp} = \%qp;
 
-       # not using $env->{PATH_INFO} here since that's already decoded
+       # avoiding $env->{PATH_INFO} here since that's already decoded
        my ($path_info) = ($env->{REQUEST_URI} =~ path_re($env));
+       $path_info //= $env->{PATH_INFO};
        my $method = $env->{REQUEST_METHOD};
 
        if ($method eq 'POST') {
@@ -87,7 +88,7 @@ sub call {
 
        # top-level indices and feeds
        if ($path_info eq '/') {
-               r404();
+               www_listing($self)->call($env);
        } elsif ($path_info =~ m!$INBOX_RE\z!o) {
                invalid_inbox($ctx, $1) || r301($ctx, $1);
        } elsif ($path_info =~ m!$INBOX_RE(?:/|/index\.html)?\z!o) {
@@ -148,8 +149,11 @@ sub preload {
        require PublicInbox::MIME;
        require Digest::SHA;
        require POSIX;
-
-       foreach (qw(PublicInbox::Search PublicInbox::SearchView
+       eval {
+               require PublicInbox::Search;
+               PublicInbox::Search::load_xapian();
+       };
+       foreach (qw(PublicInbox::SearchView
                        PublicInbox::Mbox IO::Compress::Gzip
                        PublicInbox::NewsWWW)) {
                eval "require $_;";
@@ -157,6 +161,7 @@ sub preload {
        if (ref($self)) {
                $self->cgit;
                $self->stylesheets_prepare($_) for ('', '../', '../../');
+               $self->www_listing;
        }
 }
 
@@ -166,7 +171,6 @@ sub r404 {
        my ($ctx) = @_;
        if ($ctx && $ctx->{mid}) {
                require PublicInbox::ExtMsg;
-               searcher($ctx);
                return PublicInbox::ExtMsg::ext_msg($ctx);
        }
        r(404, 'Not Found');
@@ -237,7 +241,6 @@ sub get_new {
 sub get_index {
        my ($ctx) = @_;
        require PublicInbox::Feed;
-       searcher($ctx);
        if ($ctx->{env}->{QUERY_STRING} =~ /(?:\A|[&;])q=/) {
                require PublicInbox::SearchView;
                PublicInbox::SearchView::sres_top_html($ctx);
@@ -257,14 +260,13 @@ sub get_mid_txt {
 sub get_mid_html {
        my ($ctx) = @_;
        require PublicInbox::View;
-       searcher($ctx);
        PublicInbox::View::msg_page($ctx) || r404($ctx);
 }
 
 # /$INBOX/$MESSAGE_ID/t/
 sub get_thread {
        my ($ctx, $flat) = @_;
-       searcher($ctx) or return need_search($ctx);
+       $ctx->{-inbox}->over or return need($ctx, 'Overview');
        $ctx->{flat} = $flat;
        require PublicInbox::View;
        PublicInbox::View::thread_html($ctx);
@@ -301,21 +303,11 @@ sub ctx_get {
        $val;
 }
 
-# search support is optional, returns undef if Xapian is not installed
-# or not configured for the given GIT_DIR
-sub searcher {
-       my ($ctx) = @_;
-       eval {
-               require PublicInbox::Search;
-               $ctx->{srch} = $ctx->{-inbox}->search;
-       };
-}
-
-sub need_search {
-       my ($ctx) = @_;
+sub need {
+       my ($ctx, $extra) = @_;
        my $msg = <<EOF;
-<html><head><title>Search not available for this
-public-inbox</title><body><pre>Search is not available for this public-inbox
+<html><head><title>$extra not available for this
+public-inbox</title><body><pre>$extra is not available for this public-inbox
 <a href="../">Return to index</a></pre></body></html>
 EOF
        [ 501, [ 'Content-Type' => 'text/html; charset=UTF-8' ], [ $msg ] ];
@@ -328,16 +320,16 @@ EOF
 # especially on older systems.  Stick to zlib since that's what git uses.
 sub get_thread_mbox {
        my ($ctx, $sfx) = @_;
-       my $srch = searcher($ctx) or return need_search($ctx);
+       my $over = $ctx->{-inbox}->over or return need($ctx, 'Overview');
        require PublicInbox::Mbox;
-       PublicInbox::Mbox::thread_mbox($ctx, $srch, $sfx);
+       PublicInbox::Mbox::thread_mbox($ctx, $over, $sfx);
 }
 
 
 # /$INBOX/$MESSAGE_ID/t.atom             -> thread as Atom feed
 sub get_thread_atom {
        my ($ctx) = @_;
-       searcher($ctx) or return need_search($ctx);
+       $ctx->{-inbox}->over or return need($ctx, 'Overview');
        require PublicInbox::Feed;
        PublicInbox::Feed::generate_thread_atom($ctx);
 }
@@ -451,7 +443,7 @@ sub serve_git {
 sub mbox_results {
        my ($ctx) = @_;
        if ($ctx->{env}->{QUERY_STRING} =~ /(?:\A|[&;])q=/) {
-               searcher($ctx) or return need_search($ctx);
+               $ctx->{-inbox}->search or return need($ctx, 'search');
                require PublicInbox::SearchView;
                return PublicInbox::SearchView::mbox_results($ctx);
        }
@@ -462,7 +454,6 @@ sub serve_mbox_range {
        my ($ctx, $inbox, $range) = @_;
        invalid_inbox($ctx, $inbox) || eval {
                require PublicInbox::Mbox;
-               searcher($ctx);
                PublicInbox::Mbox::emit_range($ctx, $range);
        }
 }
@@ -489,6 +480,14 @@ sub cgit {
        }
 }
 
+sub www_listing {
+       my ($self) = @_;
+       $self->{www_listing} ||= do {
+               require PublicInbox::WwwListing;
+               PublicInbox::WwwListing->new($self);
+       }
+}
+
 sub get_attach {
        my ($ctx, $idx, $fn) = @_;
        require PublicInbox::WwwAttach;