about summary refs log tree commit homepage
path: root/lib/PublicInbox/ExtMsg.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-07-06 01:21:17 +0000
committerEric Wong <e@80x24.org>2016-07-06 07:12:45 +0000
commit54fd19fc1ecb0bca805ed101416b8b0bb0a4c5d3 (patch)
tree0e75b2c34120471e2bd56dc42bd41fb9861b6eaa /lib/PublicInbox/ExtMsg.pm
parent10a681c149a154935e9f879c8b215074c072cc7e (diff)
downloadpublic-inbox-54fd19fc1ecb0bca805ed101416b8b0bb0a4c5d3.tar.gz
Automatic inbox switching was a potentially deceptive pattern
and surprises readers who do not check the URL bar closely.
Furthermore, a message could be cross-posted to multiple lists,
too.
Diffstat (limited to 'lib/PublicInbox/ExtMsg.pm')
-rw-r--r--lib/PublicInbox/ExtMsg.pm57
1 files changed, 44 insertions, 13 deletions
diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm
index 62381e9e..4925a592 100644
--- a/lib/PublicInbox/ExtMsg.pm
+++ b/lib/PublicInbox/ExtMsg.pm
@@ -8,9 +8,9 @@
 package PublicInbox::ExtMsg;
 use strict;
 use warnings;
-use URI::Escape qw(uri_escape_utf8);
 use PublicInbox::Hval;
 use PublicInbox::MID qw/mid2path/;
+use PublicInbox::WwwStream;
 
 # TODO: user-configurable
 our @EXT_URL = (
@@ -61,19 +61,21 @@ sub ext_msg {
                 }
         });
 
-        # TODO: multiple hits
-        return r302($found[0], $mid) if @found;
+        return exact($ctx, \@found, $mid) if @found;
 
         # Xapian not installed or configured for some repos,
-        # do a full MID check:
+        # do a full MID check (this is expensive...):
         if (@nox) {
                 my $path = mid2path($mid);
                 foreach my $other (@nox) {
                         my (undef, $type, undef) = $other->path_check($path);
 
-                        return r302($other, $mid) if $type && $type eq 'blob';
+                        if ($type && $type eq 'blob') {
+                                push @found, $other;
+                        }
                 }
         }
+        return exact($ctx, \@found, $mid) if @found;
 
         # fall back to partial MID matching
         my $n_partial = 0;
@@ -138,14 +140,43 @@ again:
         [$code, ['Content-Type'=>'text/html; charset=UTF-8'], [$s]];
 }
 
-# Redirect to another public-inbox which is mapped by $pi_config
-# TODO: prompt for inbox-switching
-sub r302 {
-        my ($inbox, $mid) = @_;
-        my $url = $inbox->base_url . uri_escape_utf8($mid) . '/';
-        [ 302,
-          [ 'Location' => $url, 'Content-Type' => 'text/plain' ],
-          [ "Redirecting to\n$url\n" ] ]
+sub ext_urls {
+        my ($ctx, $mid, $href, $html) = @_;
+
+        # Fall back to external repos if configured
+        if (@EXT_URL && index($mid, '@') >= 0) {
+                my $env = $ctx->{env};
+                my $e = "\nPerhaps try an external site:\n\n";
+                foreach my $url (@EXT_URL) {
+                        my $u = PublicInbox::Hval::prurl($env, $url);
+                        my $r = sprintf($u, $href);
+                        my $t = sprintf($u, $html);
+                        $e .= qq{<a\nhref="$r">$t</a>\n};
+                }
+                return $e;
+        }
+        ''
+}
+
+sub exact {
+        my ($ctx, $found, $mid) = @_;
+        my $h = PublicInbox::Hval->new_msgid($mid);
+        my $href = $h->as_href;
+        my $html = $h->as_html;
+        my $title = "&lt;$html&gt; found in ";
+        my $end = @$found == 1 ? 'another inbox' : 'other inboxes';
+        $ctx->{-title_html} = $title . $end;
+        $ctx->{-upfx} = '../';
+        my $ext_urls = ext_urls($ctx, $mid, $href, $html);
+        my $code = (@$found == 1 && $ext_urls eq '') ? 200 : 300;
+        $ctx->{-html_tip} = join('',
+                        "<pre>Message-ID: &lt;$html&gt;\nfound in $end:\n\n",
+                                (map {
+                                        my $u = $_->base_url;
+                                        qq(<a\nhref="$u$href/">$u$html/</a>\n)
+                                } @$found),
+                        $ext_urls, '</pre>');
+        PublicInbox::WwwStream->response($ctx, $code);
 }
 
 1;