Search not available for this
-public-inboxSearch is not available for this public-inbox
-Return to index
+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
- [ 501, [ 'Content-Type' => 'text/html; charset=UTF-8' ], [ $msg ] ];
}
# /$INBOX/$MESSAGE_ID/t.mbox -> thread as mbox
@@ -328,16 +335,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->{ibx}->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->{ibx}->over or return need($ctx, 'Overview');
require PublicInbox::Feed;
PublicInbox::Feed::generate_thread_atom($ctx);
}
@@ -402,13 +409,13 @@ sub legacy_redirects {
sub r301 {
my ($ctx, $inbox, $mid_ue, $suffix) = @_;
- my $obj = $ctx->{-inbox};
- unless ($obj) {
+ my $ibx = $ctx->{ibx};
+ unless ($ibx) {
my $r404 = invalid_inbox($ctx, $inbox);
return $r404 if $r404;
- $obj = $ctx->{-inbox};
+ $ibx = $ctx->{ibx};
}
- my $url = $obj->base_url($ctx->{env});
+ my $url = $ibx->base_url($ctx->{env});
my $qs = $ctx->{env}->{QUERY_STRING};
if (defined $mid_ue) {
# common, and much nicer as '@' than '%40':
@@ -441,17 +448,17 @@ sub msg_page {
}
sub serve_git {
- my ($ctx, $part, $path) = @_;
+ my ($ctx, $epoch, $path) = @_;
my $env = $ctx->{env};
- my $ibx = $ctx->{-inbox};
- my $git = defined $part ? $ibx->git_part($part) : $ibx->git;
+ my $ibx = $ctx->{ibx};
+ my $git = defined $epoch ? $ibx->git_epoch($epoch) : $ibx->git;
$git ? PublicInbox::GitHTTPBackend::serve($env, $git, $path) : r404();
}
sub mbox_results {
my ($ctx) = @_;
if ($ctx->{env}->{QUERY_STRING} =~ /(?:\A|[&;])q=/) {
- searcher($ctx) or return need_search($ctx);
+ $ctx->{ibx}->isrch or return need($ctx, 'search');
require PublicInbox::SearchView;
return PublicInbox::SearchView::mbox_results($ctx);
}
@@ -462,33 +469,50 @@ sub serve_mbox_range {
my ($ctx, $inbox, $range) = @_;
invalid_inbox($ctx, $inbox) || eval {
require PublicInbox::Mbox;
- searcher($ctx);
PublicInbox::Mbox::emit_range($ctx, $range);
}
}
sub news_www {
my ($self) = @_;
- $self->{news_www} ||= do {
+ $self->{news_www} //= do {
require PublicInbox::NewsWWW;
- PublicInbox::NewsWWW->new($self->{pi_config});
+ PublicInbox::NewsWWW->new($self->{pi_cfg});
}
}
sub cgit {
my ($self) = @_;
- $self->{cgit} ||= do {
- my $pi_config = $self->{pi_config};
+ $self->{cgit} //= do {
+ my $pi_cfg = $self->{pi_cfg};
- if (defined($pi_config->{'publicinbox.cgitrc'})) {
+ if (defined($pi_cfg->{'publicinbox.cgitrc'})) {
require PublicInbox::Cgit;
- PublicInbox::Cgit->new($pi_config);
+ PublicInbox::Cgit->new($pi_cfg);
} else {
+ 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});
+ }
+}
+
+# GET $INBOX/manifest.js.gz
+sub get_inbox_manifest ($$$) {
+ my ($ctx, $inbox, $key) = @_;
+ my $r404 = invalid_inbox($ctx, $inbox);
+ return $r404 if $r404;
+ require PublicInbox::ManifestJsGz;
+ PublicInbox::ManifestJsGz::per_inbox($ctx);
+}
+
sub get_attach {
my ($ctx, $idx, $fn) = @_;
require PublicInbox::WwwAttach;
@@ -518,7 +542,7 @@ sub stylesheets_prepare ($$) {
} || sub { $_[0] };
my $css_map = {};
- my $stylesheets = $self->{pi_config}->{css} || [];
+ my $stylesheets = $self->{pi_cfg}->{css} || [];
my $links = [];
my $inline_ok = 1;
@@ -535,11 +559,15 @@ sub stylesheets_prepare ($$) {
$inline_ok = 0;
} else {
my $fn = $_;
+ my ($key) = (m!([^/]+?)(?:\.css)?\z!i);
+ if ($key !~ /\A[a-zA-Z0-9_\-\.]+\z/) {
+ warn "ignoring $fn, non-ASCII word character\n";
+ next;
+ }
open(my $fh, '<', $fn) or do {
warn "failed to open $fn: $!\n";
next;
};
- my ($key) = (m!([^/]+?)(?:\.css)?\z!i);
my $ctime = 0;
my $local = do { local $/; <$fh> };
if ($local =~ /\S/) {
@@ -605,26 +633,46 @@ sub style {
};
}
-# /$INBOX/$KEY.css endpoint
+# /$INBOX/$KEY.css and /+/$KEY.css endpoints
# CSS is configured globally for all inboxes, but we access them on
# a per-inbox basis. This allows administrators to setup per-inbox
# static routes to intercept the request before it hits PSGI
+# inbox == undef => top-level WwwListing
sub get_css ($$$) {
my ($ctx, $inbox, $key) = @_;
- my $r404 = invalid_inbox($ctx, $inbox);
+ my $r404 = defined($inbox) ? invalid_inbox($ctx, $inbox) : undef;
return $r404 if $r404;
my $self = $ctx->{www};
- my $css_map = $self->{-css_map} || stylesheets_prepare($self, '');
+ my $css_map = $self->{-css_map} ||
+ stylesheets_prepare($self, defined($inbox) ? '' : '+/');
my $css = $css_map->{$key};
- if (!defined($css) && $key eq 'userContent') {
+ if (!defined($css) && defined($inbox) && $key eq 'userContent') {
my $env = $ctx->{env};
- $css = PublicInbox::UserContent::sample($ctx->{-inbox}, $env);
+ $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 ] ];
}
+sub get_description {
+ my ($ctx, $inbox) = @_;
+ invalid_inbox($ctx, $inbox) || do {
+ my $d = $ctx->{ibx}->description . "\n";
+ 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;