]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WWW.pm
wwwstream: fix "Atom feed" link
[public-inbox.git] / lib / PublicInbox / WWW.pm
index 2434f2f581b2b0fbd1d48d1a08881bf0a1c1187b..2ea5d80db7817a8d2d12a94f5f1b38c6c92833b1 100644 (file)
@@ -22,6 +22,7 @@ use PublicInbox::MID qw(mid_escape);
 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\.\-]*)!;
@@ -65,6 +66,8 @@ sub call {
                        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);
                }
@@ -123,6 +126,8 @@ sub call {
                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);
@@ -137,11 +142,17 @@ sub call {
 # 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 PublicInbox::Eml;
        require PublicInbox::Mbox;
        require PublicInbox::ViewVCS;
        require PublicInbox::WwwText;
@@ -150,8 +161,8 @@ sub preload {
                require PublicInbox::Search;
                PublicInbox::Search::load_xapian();
        };
-       foreach (qw(PublicInbox::SearchView PublicInbox::MboxGz)) {
-               eval "require $_;";
+       for (qw(SearchView MboxGz WwwAltId)) {
+               eval "require PublicInbox::$_;";
        }
        if (ref($self)) {
                my $pi_config = $self->{pi_config};
@@ -168,6 +179,7 @@ sub preload {
 
 sub preload_inbox {
        my $ibx = shift;
+       $ibx->altid_map;
        $ibx->cloneurl;
        $ibx->description;
        $ibx->base_url;
@@ -220,9 +232,8 @@ sub invalid_inbox_mid {
                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;
@@ -290,9 +301,8 @@ sub get_text {
 }
 
 # 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);
@@ -301,14 +311,21 @@ sub get_vcs_object ($$$;$) {
        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