]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WWW.pm
www: use Inbox->over where appropriate
[public-inbox.git] / lib / PublicInbox / WWW.pm
index 6e69001c4c4d78fa2e52fc851525c30bfd8f7a59..0f963dcbd907af3097ed5d0a8462c20acee3a0d9 100644 (file)
@@ -11,7 +11,7 @@
 # - Must not rely on static content
 # - UTF-8 is only for user-content, 7-bit US-ASCII for us
 package PublicInbox::WWW;
-use 5.008;
+use 5.010_001;
 use strict;
 use warnings;
 use bytes (); # only for bytes::length
@@ -68,8 +68,9 @@ sub call {
        } 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) {
@@ -157,6 +158,7 @@ sub preload {
        if (ref($self)) {
                $self->cgit;
                $self->stylesheets_prepare($_) for ('', '../', '../../');
+               $self->www_listing;
        }
 }
 
@@ -166,7 +168,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 +238,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 +257,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 +300,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 +317,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 +440,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 +451,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 +477,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;