X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FWWW.pm;h=9ffcb879d9ef5be1c17f199a351bb5906ab5bedc;hb=HEAD;hp=1afdece0f39f5a946a09961cbd194d456f1dcc51;hpb=26c635060dcae35feae836b02a18a6a11e408312;p=public-inbox.git
diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm
index 1afdece0..9ffcb879 100644
--- a/lib/PublicInbox/WWW.pm
+++ b/lib/PublicInbox/WWW.pm
@@ -1,4 +1,4 @@
-# Copyright (C) 2014-2021 all contributors
+# Copyright (C) all contributors
# License: AGPL-3.0+
#
# Main web interface for mailing list archives
@@ -11,10 +11,8 @@
# - Must not rely on static content
# - UTF-8 is only for user-content, 7-bit US-ASCII for us
package PublicInbox::WWW;
-use 5.010_001;
use strict;
-use warnings;
-use bytes (); # only for bytes::length
+use v5.10.1;
use PublicInbox::Config;
use PublicInbox::Hval;
use URI::Escape qw(uri_unescape);
@@ -25,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,}!;
@@ -66,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);
}
@@ -172,21 +174,13 @@ sub preload {
if (defined($pi_cfg->{'publicinbox.cgitrc'})) {
$pi_cfg->limiter('-cgit');
}
+ $pi_cfg->ALL and require PublicInbox::Isearch;
$self->cgit;
$self->stylesheets_prepare($_) for ('', '../', '../../');
$self->news_www;
- $pi_cfg->each_inbox(\&preload_inbox);
}
}
-sub preload_inbox {
- my $ibx = shift;
- $ibx->altid_map;
- $ibx->cloneurl;
- $ibx->description;
- $ibx->base_url;
-}
-
# private functions below
sub r404 {
@@ -200,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
@@ -309,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);
}
@@ -325,7 +330,7 @@ sub get_altid_dump {
sub need {
my ($ctx, $extra) = @_;
require PublicInbox::WwwStream;
- PublicInbox::WwwStream::html_oneshot($ctx, 501, \<$extra is not available for this public-inbox
Return to index
EOF
@@ -447,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);
}
@@ -478,7 +487,7 @@ sub serve_mbox_range {
sub news_www {
my ($self) = @_;
- $self->{news_www} ||= do {
+ $self->{news_www} //= do {
require PublicInbox::NewsWWW;
PublicInbox::NewsWWW->new($self->{pi_cfg});
}
@@ -486,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});
}
}
@@ -646,8 +660,7 @@ sub get_css ($$$) {
$css = PublicInbox::UserContent::sample($ctx->{ibx}, $env);
}
defined $css or return r404();
- my $h = [ 'Content-Length', bytes::length($css),
- 'Content-Type', 'text/css' ];
+ my $h = [ 'Content-Length', length($css), 'Content-Type', 'text/css' ];
PublicInbox::GitHTTPBackend::cache_one_year($h);
[ 200, $h, [ $css ] ];
}
@@ -656,9 +669,19 @@ sub get_description {
my ($ctx, $inbox) = @_;
invalid_inbox($ctx, $inbox) || do {
my $d = $ctx->{ibx}->description . "\n";
- [ 200, [ 'Content-Length', bytes::length($d),
+ utf8::encode($d);
+ [ 200, [ 'Content-Length', length($d),
'Content-Type', 'text/plain' ], [ $d ] ];
};
}
+sub event_step { # called via requeue
+ my ($self) = @_;
+ # gzf = PublicInbox::GzipFilter == $ctx
+ my $gzf = shift(@{$self->{-low_prio_q}}) // return;
+ PublicInbox::DS::requeue($self) if scalar(@{$self->{-low_prio_q}});
+ my $http = $gzf->{env}->{'psgix.io'}; # PublicInbox::HTTP
+ $http->next_step($gzf->can('async_next'));
+}
+
1;