lib/PublicInbox/ExtMsg.pm | 30 ++++++++++++++++++++++++++++-- public-inbox.cgi | 1 + t/cgi.t | 6 +++--- diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm index bdbff78f5ec83396c575c08dc80ac5be3e4fd177..3e0e6e4e636b068dd36e7dd7897efed466e6b1b0 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 @@ } } } - # 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";
- [404, ['Content-Type'=>'text/plain'], ['Not found']];
+ 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};
+ }
+ }
+
+ [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 1fcc04fa195bcb18a318080fbad6ced743c72d71..b095621da3c9c1f7d583959a05f049341b3c6b22 100755
--- a/public-inbox.cgi
+++ b/public-inbox.cgi
@@ -17,6 +17,7 @@ }
%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
--- a/t/cgi.t
+++ b/t/cgi.t
@@ -160,19 +160,19 @@ $res = cgi_run("/test/blahblah\@example.com/raw");
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/,