about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-03-11 05:32:07 +0000
committerEric Wong <e@80x24.org>2019-04-04 09:13:58 +0000
commit411dc580077c5240e9cfd4808c06623345435b69 (patch)
tree913d0571dee0c1b76e7fb0d7d909a853ff71494f /lib
parent7f9cf4cbf5920591a955035555c2969d7d29af66 (diff)
downloadpublic-inbox-411dc580077c5240e9cfd4808c06623345435b69.tar.gz
Requests intended for cgit are unlikely to conflict with
requests to inboxes.  So we can safely hand those requests
off to cgit.cgi.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/Config.pm3
-rw-r--r--lib/PublicInbox/WWW.pm20
2 files changed, 21 insertions, 2 deletions
diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm
index 4b246720..ec9a469c 100644
--- a/lib/PublicInbox/Config.pm
+++ b/lib/PublicInbox/Config.pm
@@ -30,6 +30,7 @@ sub new {
         $self->{-no_obfuscate} ||= {};
         $self->{-limiters} ||= {};
         $self->{-code_repos} ||= {}; # nick => PublicInbox::Git object
+        $self->{-cgitrc_unparsed} = $self->{'publicinbox.cgitrc'};
 
         if (my $no = delete $self->{'publicinbox.noobfuscate'}) {
                 $no = _array($no);
@@ -244,7 +245,7 @@ sub _fill_code_repo {
         my $pfx = "coderepo.$nick";
 
         # TODO: support gitweb and other repository viewers?
-        if (defined(my $cgitrc = delete $self->{'publicinbox.cgitrc'})) {
+        if (defined(my $cgitrc = delete $self->{-cgitrc_unparsed})) {
                 parse_cgitrc($self, $cgitrc, 0);
         }
         my $dir = $self->{"$pfx.dir"}; # aka "GIT_DIR"
diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm
index 7ed4f654..6e14e8c1 100644
--- a/lib/PublicInbox/WWW.pm
+++ b/lib/PublicInbox/WWW.pm
@@ -15,6 +15,7 @@ use 5.008;
 use strict;
 use warnings;
 use bytes (); # only for bytes::length
+use Plack::Util;
 use PublicInbox::Config;
 use PublicInbox::Hval;
 use URI::Escape qw(uri_unescape);
@@ -154,6 +155,7 @@ sub preload {
                 eval "require $_;";
         }
         if (ref($self)) {
+                $self->cgit;
                 $self->stylesheets_prepare($_) for ('', '../', '../../');
         }
 }
@@ -188,7 +190,9 @@ sub invalid_inbox ($$) {
         # generation and link things intended for nntp:// to https?://,
         # so try to infer links and redirect them to the appropriate
         # list URL.
-        $www->news_www->call($ctx->{env});
+        my $env = $ctx->{env};
+        my $res = $www->news_www->call($env);
+        $res->[0] == 404 ? $www->cgit->call($env) : $res;
 }
 
 # returns undef if valid, array ref response if invalid
@@ -467,6 +471,20 @@ sub news_www {
         }
 }
 
+sub cgit {
+        my ($self) = @_;
+        $self->{cgit} ||= do {
+                my $pi_config = $self->{pi_config};
+
+                if (defined($pi_config->{'publicinbox.cgitrc'})) {
+                        require PublicInbox::Cgit;
+                        PublicInbox::Cgit->new($pi_config);
+                } else {
+                        Plack::Util::inline_object(call => sub { r404() });
+                }
+        }
+}
+
 sub get_attach {
         my ($ctx, $idx, $fn) = @_;
         require PublicInbox::WwwAttach;