about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-09-03 01:57:12 +0000
committerEric Wong <e@80x24.org>2015-09-03 02:04:40 +0000
commit793da75fbcb5a2c546b3d582f39761fff3d8292d (patch)
tree3da469a09280ada32b0023a21d67a7778e9d78d8
parent81a9c1b476987d845b340ab9013d26cf4487cb9a (diff)
downloadpublic-inbox-793da75fbcb5a2c546b3d582f39761fff3d8292d.tar.gz
Since cross-posting is inevitable, we shall link to external
message archives for interopability.
-rw-r--r--lib/PublicInbox/ExtMsg.pm30
-rwxr-xr-xpublic-inbox.cgi1
-rw-r--r--t/cgi.t6
3 files changed, 32 insertions, 5 deletions
diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm
index bdbff78f..3e0e6e4e 100644
--- a/lib/PublicInbox/ExtMsg.pm
+++ b/lib/PublicInbox/ExtMsg.pm
@@ -7,6 +7,14 @@ use URI::Escape qw(uri_escape_utf8);
 use PublicInbox::Hval;
 use PublicInbox::MID qw/mid_compress mid2path/;
 
+# TODO: user-configurable
+our @EXT_URL = (
+        'http://mid.gmane.org/%s',
+        'https://lists.debian.org/msgid-search/%s',
+        'http://mid.mail-archive.com/%s',
+        'http://marc.info/?i=%s',
+);
+
 sub ext_msg {
         my ($ctx) = @_;
         my $pi_config = $ctx->{pi_config};
@@ -74,9 +82,27 @@ sub ext_msg {
                 }
         }
 
-        # Fall back to external repos
+        my $code = 404;
+        my $h = PublicInbox::Hval->new_msgid($mid, 1);
+        my $href = $h->as_href;
+        my $html = $h->as_html;
+        my $title = "Message-ID &lt;$html&gt; not found";
+
+        # Fall back to external repos if configured
+        my $s = "<html><head><title>$title</title>" .
+                "</head><body><pre><b>$title</b>";
+
+        if (@EXT_URL) {
+                $code = 300;
+                $s .= "\n\nPerhaps try an external site:\n\n";
+                foreach my $u (@EXT_URL) {
+                        my $r = sprintf($u, $href);
+                        my $t = sprintf($u, $html);
+                        $s .= qq{<a\nhref="$r">$t</a>\n};
+                }
+        }
 
-        [404, ['Content-Type'=>'text/plain'], ['Not found']];
+        [300, ['Content-Type'=>'text/html; charset=UTF-8'], [$s]];
 }
 
 # Redirect to another public-inbox which is mapped by $pi_config
diff --git a/public-inbox.cgi b/public-inbox.cgi
index 1fcc04fa..b095621d 100755
--- a/public-inbox.cgi
+++ b/public-inbox.cgi
@@ -17,6 +17,7 @@ BEGIN {
 
         %HTTP_CODES = (
                 200 => 'OK',
+                300 => 'Multiple Choices',
                 301 => 'Moved Permanently',
                 302 => 'Found',
                 404 => 'Not Found',
diff --git a/t/cgi.t b/t/cgi.t
index a6600c20..b0af8ae1 100644
--- a/t/cgi.t
+++ b/t/cgi.t
@@ -160,19 +160,19 @@ EOF
         like($res->{body}, qr/Message-Id: <blahblah\@example\.com>/,
                 "mid raw hit");
         $res = cgi_run("/test/blahblah\@example.con/raw");
-        like($res->{head}, qr/Status: 404 Not Found/, "mid raw miss");
+        like($res->{head}, qr/Status: 300 Multiple Choices/, "mid raw miss");
 
         $res = cgi_run("/test/blahblah\@example.com/");
         like($res->{body}, qr/\A<html>/, "mid html hit");
         like($res->{head}, qr/Status: 200 OK/, "200 response");
         $res = cgi_run("/test/blahblah\@example.con/");
-        like($res->{head}, qr/Status: 404 Not Found/, "mid html miss");
+        like($res->{head}, qr/Status: 300 Multiple Choices/, "mid html miss");
 
         $res = cgi_run("/test/blahblah\@example.com/f/");
         like($res->{body}, qr/\A<html>/, "mid html");
         like($res->{head}, qr/Status: 200 OK/, "200 response");
         $res = cgi_run("/test/blahblah\@example.con/f/");
-        like($res->{head}, qr/Status: 404 Not Found/, "mid html miss");
+        like($res->{head}, qr/Status: 300 Multiple Choices/, "mid html miss");
 
         $res = cgi_run("/test/");
         like($res->{body}, qr/slashy%2Fasdf%40example\.com/,