]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WWW.pm
No ext_urls
[public-inbox.git] / lib / PublicInbox / WWW.pm
index a282784a257fb523ca3ae6a59567628709ecd5a6..9ffcb879d9ef5be1c17f199a351bb5906ab5bedc 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2014-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # Main web interface for mailing list archives
@@ -23,9 +23,9 @@ use PublicInbox::WwwStatic qw(r path_info_raw);
 use PublicInbox::Eml;
 
 # TODO: consider a routing tree now that we have more endpoints:
-our $INBOX_RE = qr!\A/([\w\-][\w\.\-]*)!;
+our $INBOX_RE = qr!\A/([\w\-][\w\.\-\+]*)!;
 our $MID_RE = qr!([^/]+)!;
-our $END_RE = qr!(T/|t/|t\.mbox(?:\.gz)?|t\.atom|raw|)!;
+our $END_RE = qr!(T/|t/|d/|t\.mbox(?:\.gz)?|t\.atom|raw|)!;
 our $ATTACH_RE = qr!([0-9][0-9\.]*)-($PublicInbox::Hval::FN)!;
 our $OID_RE = qr![a-f0-9]{7,}!;
 
@@ -64,6 +64,10 @@ sub call {
                                serve_git($ctx, $epoch, $path);
                } elsif ($path_info =~ m!$INBOX_RE/(\w+)\.sql\.gz\z!o) {
                        return get_altid_dump($ctx, $1, $2);
+               } elsif ($path_info =~ m!$INBOX_RE/$MID_RE/$ATTACH_RE\z!o) {
+                       my ($idx, $fn) = ($3, $4);
+                       return invalid_inbox_mid($ctx, $1, $2) ||
+                               get_attach($ctx, $idx, $fn);
                } elsif ($path_info =~ m!$INBOX_RE/!o) {
                        return invalid_inbox($ctx, $1) || mbox_results($ctx);
                }
@@ -190,10 +194,20 @@ sub r404 {
 
 sub news_cgit_fallback ($) {
        my ($ctx) = @_;
-       my $www = $ctx->{www};
-       my $env = $ctx->{env};
-       my $res = $www->news_www->call($env);
-       $res->[0] == 404 ? $www->cgit->call($env) : $res;
+       my $res = $ctx->{www}->news_www->call($ctx->{env});
+
+       $res->[0] == 404 and ($ctx->{www}->{cgit_fallback} //= do {
+               my $c = $ctx->{www}->{pi_cfg}->{'publicinbox.cgit'} // 'first';
+               $c ne 'first' # `fallback' and `rewrite' => true
+       } // 0) and $res = $ctx->{www}->coderepo->srv($ctx);
+
+       ref($res) eq 'ARRAY' && $res->[0] == 404 and
+               $res = $ctx->{www}->cgit->call($ctx->{env}, $ctx);
+
+       ref($res) eq 'ARRAY' && $res->[0] == 404 &&
+                       !$ctx->{www}->{cgit_fallback} and
+               $res = $ctx->{www}->coderepo->srv($ctx);
+       $res;
 }
 
 # returns undef if valid, array ref response if invalid
@@ -299,7 +313,8 @@ sub get_text {
 sub get_vcs_object ($$$;$) {
        my ($ctx, $inbox, $oid, $filename) = @_;
        my $r404 = invalid_inbox($ctx, $inbox);
-       return $r404 if $r404 || !$ctx->{www}->{pi_cfg}->repo_objs($ctx->{ibx});
+       return $r404 if $r404;
+       return r(404) if !$ctx->{www}->{pi_cfg}->repo_objs($ctx->{ibx});
        require PublicInbox::ViewVCS;
        PublicInbox::ViewVCS::show($ctx, $oid, $filename);
 }
@@ -315,7 +330,7 @@ sub get_altid_dump {
 sub need {
        my ($ctx, $extra) = @_;
        require PublicInbox::WwwStream;
-       PublicInbox::WwwStream::html_oneshot($ctx, 501, \<<EOF);
+       PublicInbox::WwwStream::html_oneshot($ctx, 501, <<EOF);
 <pre>$extra is not available for this public-inbox
 <a\nhref="../">Return to index</a></pre>
 EOF
@@ -437,6 +452,10 @@ sub msg_page {
 
        # legacy, but no redirect for compatibility:
        'f/' eq $e and return get_mid_html($ctx);
+       if ($e eq 'd/') {
+               require PublicInbox::View;
+               return PublicInbox::View::diff_msg($ctx);
+       }
        r404($ctx);
 }
 
@@ -476,16 +495,21 @@ sub news_www {
 
 sub cgit {
        my ($self) = @_;
-       $self->{cgit} //= do {
-               my $pi_cfg = $self->{pi_cfg};
-
-               if (defined($pi_cfg->{'publicinbox.cgitrc'})) {
+       $self->{cgit} //=
+               (defined($self->{pi_cfg}->{'publicinbox.cgitrc'}) ? do {
                        require PublicInbox::Cgit;
-                       PublicInbox::Cgit->new($pi_cfg);
-               } else {
+                       PublicInbox::Cgit->new($self->{pi_cfg});
+               } : undef) // do {
                        require Plack::Util;
                        Plack::Util::inline_object(call => sub { r404() });
-               }
+               };
+}
+
+sub coderepo {
+       my ($self) = @_;
+       $self->{coderepo} //= do {
+               require PublicInbox::WwwCoderepo;
+               PublicInbox::WwwCoderepo->new($self->{pi_cfg});
        }
 }