]> Sergey Matveev's repositories - public-inbox.git/commitdiff
ExtMsg: 300 to external mailing list archives
authorEric Wong <e@80x24.org>
Thu, 3 Sep 2015 01:57:12 +0000 (01:57 +0000)
committerEric Wong <e@80x24.org>
Thu, 3 Sep 2015 02:04:40 +0000 (02:04 +0000)
Since cross-posting is inevitable, we shall link to external
message archives for interopability.

lib/PublicInbox/ExtMsg.pm
public-inbox.cgi
t/cgi.t

index bdbff78f5ec83396c575c08dc80ac5be3e4fd177..3e0e6e4e636b068dd36e7dd7897efed466e6b1b0 100644 (file)
@@ -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
index 1fcc04fa195bcb18a318080fbad6ced743c72d71..b095621da3c9c1f7d583959a05f049341b3c6b22 100755 (executable)
@@ -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 a6600c20081c9ecfbfd748f260cb84ea2fb84ecf..b0af8ae179b2af2c8b9f6f5e00face8180ae6207 100644 (file)
--- 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/,