diff options
-rw-r--r-- | lib/PublicInbox/ExtMsg.pm | 30 | ||||
-rwxr-xr-x | public-inbox.cgi | 1 | ||||
-rw-r--r-- | 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 = "<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', @@ -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/, |