use PublicInbox::Hval;
use URI::Escape qw(uri_unescape);
use PublicInbox::MID qw(mid_escape);
-require PublicInbox::Git;
use PublicInbox::GitHTTPBackend;
use PublicInbox::UserContent;
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\.\-]*)!;
my ($epoch, $path) = ($2, $3);
return invalid_inbox($ctx, $1) ||
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/!o) {
return invalid_inbox($ctx, $1) || mbox_results($ctx);
}
get_vcs_object($ctx, $1, $2, $3);
} elsif ($path_info =~ m!$INBOX_RE/($OID_RE)/s\z!o) {
r301($ctx, $1, $2, 's/');
+ } elsif ($path_info =~ m!$INBOX_RE/(\w+)\.sql\.gz\z!o) {
+ get_altid_dump($ctx, $1, $2);
# convenience redirects order matters
} elsif ($path_info =~ m!$INBOX_RE/([^/]{2,})\z!o) {
r301($ctx, $1, $2);
}
}
-# for CoW-friendliness, MOOOOO!
+# for CoW-friendliness, MOOOOO! Even for single-process setups,
+# we want to get all immortal allocations done early to avoid heap
+# fragmentation since common allocators favor a large contiguous heap.
sub preload {
my ($self) = @_;
+
+ # populate caches used by Encode internally, since emails
+ # may show up with any encoding.
+ require Encode;
+ Encode::find_encoding($_) for Encode->encodings(':all');
+
+ require PublicInbox::ExtMsg;
require PublicInbox::Feed;
require PublicInbox::View;
require PublicInbox::SearchThread;
- require PublicInbox::MIME;
- require Digest::SHA;
- require POSIX;
+ require PublicInbox::Eml;
+ require PublicInbox::Mbox;
+ require PublicInbox::ViewVCS;
+ require PublicInbox::WwwText;
+ require PublicInbox::WwwAttach;
eval {
require PublicInbox::Search;
PublicInbox::Search::load_xapian();
};
- foreach (qw(PublicInbox::SearchView
- PublicInbox::Mbox IO::Compress::Gzip
- PublicInbox::NewsWWW)) {
- eval "require $_;";
+ for (qw(SearchView MboxGz WwwAltId)) {
+ eval "require PublicInbox::$_;";
}
if (ref($self)) {
+ my $pi_config = $self->{pi_config};
+ if (defined($pi_config->{'publicinbox.cgitrc'})) {
+ $pi_config->limiter('-cgit');
+ }
$self->cgit;
$self->stylesheets_prepare($_) for ('', '../', '../../');
$self->www_listing;
+ $self->news_www;
+ $pi_config->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 {
my ($x2, $x38) = ($1, $2);
# this is horrifically wasteful for legacy URLs:
my $str = $ctx->{-inbox}->msg_by_path("$x2/$x38") or return;
- require Email::Simple;
- my $s = Email::Simple->new($str);
- $mid = PublicInbox::MID::mid_clean($s->header('Message-ID'));
+ my $s = PublicInbox::Eml->new($str);
+ $mid = PublicInbox::MID::mid_clean($s->header_raw('Message-ID'));
return r301($ctx, $inbox, mid_escape($mid));
}
undef;
}
# show git objects (blobs and commits)
-# /$INBOX/_/$OBJECT_ID/show
-# /$INBOX/_/${OBJECT_ID}_${FILENAME}
-# KEY may contain slashes
+# /$INBOX/$GIT_OBJECT_ID/s/
+# /$INBOX/$GIT_OBJECT_ID/s/$FILENAME
sub get_vcs_object ($$$;$) {
my ($ctx, $inbox, $oid, $filename) = @_;
my $r404 = invalid_inbox($ctx, $inbox);
PublicInbox::ViewVCS::show($ctx, $oid, $filename);
}
+sub get_altid_dump {
+ my ($ctx, $inbox, $altid_pfx) =@_;
+ my $r404 = invalid_inbox($ctx, $inbox);
+ return $r404 if $r404;
+ eval { require PublicInbox::WwwAltId } or return need($ctx, 'sqlite3');
+ PublicInbox::WwwAltId::sqldump($ctx, $altid_pfx);
+}
+
sub need {
my ($ctx, $extra) = @_;
- my $msg = <<EOF;
-<html><head><title>$extra not available for this
-public-inbox</title><body><pre>$extra is not available for this public-inbox
-<a href="../">Return to index</a></pre></body></html>
+ require PublicInbox::WwwStream;
+ PublicInbox::WwwStream::html_oneshot($ctx, 501, \<<EOF);
+<pre>$extra is not available for this public-inbox
+<a\nhref="../">Return to index</a></pre>
EOF
- [ 501, [ 'Content-Type' => 'text/html; charset=UTF-8' ], [ $msg ] ];
}
# /$INBOX/$MESSAGE_ID/t.mbox -> thread as mbox