From 793da75fbcb5a2c546b3d582f39761fff3d8292d Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 3 Sep 2015 01:57:12 +0000 Subject: [PATCH] ExtMsg: 300 to external mailing list archives Since cross-posting is inevitable, we shall link to external message archives for interopability. --- lib/PublicInbox/ExtMsg.pm | 30 ++++++++++++++++++++++++++++-- public-inbox.cgi | 1 + t/cgi.t | 6 +++--- 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 <$html> not found"; + + # Fall back to external repos if configured + my $s = "$title" . + "
$title";
+
+	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{$t\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: /,
 		"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/, "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/, "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/,
-- 
2.44.0