From 411dc580077c5240e9cfd4808c06623345435b69 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 11 Mar 2019 05:32:07 +0000 Subject: www: wire up cgit as a 404 handler if cgitrc is configured Requests intended for cgit are unlikely to conflict with requests to inboxes. So we can safely hand those requests off to cgit.cgi. --- Documentation/public-inbox-config.pod | 8 ++++++++ lib/PublicInbox/Config.pm | 3 ++- lib/PublicInbox/WWW.pm | 20 +++++++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Documentation/public-inbox-config.pod b/Documentation/public-inbox-config.pod index 5ee93e2e..9647e4a4 100644 --- a/Documentation/public-inbox-config.pod +++ b/Documentation/public-inbox-config.pod @@ -209,6 +209,14 @@ code repositories known to cgit. Macro expansion (e.g. C<$HTTP_HOST>) is not yet supported. +=item publicinbox.cgitbin + +A path to the C executable. The L +interface can spawn cgit as a fallback if the publicinbox.cgitrc +directive is configured. + +Default: /usr/lib/cgit/cgit.cgi + =back =head2 NAMED LIMITER (PSGI) 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; -- cgit v1.2.3-24-ge0c7