#
# Displays search results for the web interface
package PublicInbox::SearchView;
use strict;
use warnings;
+use URI::Escape qw(uri_unescape uri_escape);
use PublicInbox::SearchMsg;
-use PublicInbox::Hval qw/ascii_html/;
+use PublicInbox::Hval qw/ascii_html obfuscate_addrs/;
use PublicInbox::View;
-use PublicInbox::MID qw(mid2path mid_clean mid_mime);
-use Email::MIME;
+use PublicInbox::WwwAtomStream;
+use PublicInbox::MID qw(mid2path mid_mime mid_clean mid_escape MID_ESC);
+use PublicInbox::MIME;
require PublicInbox::Git;
-require PublicInbox::Thread;
-our $LIM = 50;
+require PublicInbox::SearchThread;
+our $LIM = 200;
+
+sub noop {}
+
+sub mbox_results {
+ my ($ctx) = @_;
+ my $q = PublicInbox::SearchQuery->new($ctx->{qp});
+ my $x = $q->{x};
+ return PublicInbox::Mbox::mbox_all($ctx, $q->{'q'}) if $x eq 'm';
+ sres_top_html($ctx);
+}
sub sres_top_html {
my ($ctx) = @_;
my $q = PublicInbox::SearchQuery->new($ctx->{qp});
- my $code = 200;
+ my $x = $q->{x};
+ my $query = $q->{'q'};
+ my $code = 200;
# double the limit for expanded views:
my $opts = {
limit => $LIM,
@@ -26,73 +40,119 @@ sub sres_top_html {
mset => 1,
relevance => $q->{r},
};
- my ($mset, $total);
-
+ my ($mset, $total, $err, $cb);
+retry:
eval {
- $mset = $ctx->{srch}->query($q->{q}, $opts);
+ $mset = $ctx->{srch}->query($query, $opts);
$total = $mset->get_matches_estimated;
};
- my $err = $@;
- my $res = html_start($q, $ctx) . '';
+ $err = $@;
+ ctx_prepare($q, $ctx);
if ($err) {
$code = 400;
- $res .= err_txt($ctx, $err) . "
" . foot($ctx);
+ $ctx->{-html_tip} = ''.err_txt($ctx, $err).'
';
+ $cb = *noop;
} elsif ($total == 0) {
+ if (defined($ctx->{-uxs_retried})) {
+ # undo retry damage:
+ $q->{'q'} = $ctx->{-uxs_retried};
+ } elsif (index($q->{'q'}, '%') >= 0) {
+ $ctx->{-uxs_retried} = $q->{'q'};
+ $q->{'q'} = uri_unescape($q->{'q'});
+ goto retry;
+ }
$code = 404;
- $res .= "\n\n[No results found]
".foot($ctx);
+ $ctx->{-html_tip} = "\n[No results found]
";
+ $cb = *noop;
} else {
- my $x = $q->{x};
- return sub { adump($_[0], $mset, $q, $ctx) } if ($x eq 'A');
+ return adump($_[0], $mset, $q, $ctx) if $x eq 'A';
- $res .= search_nav_top($mset, $q) . "\n\n";
+ $ctx->{-html_tip} = search_nav_top($mset, $q, $ctx);
if ($x eq 't') {
- return sub { tdump($_[0], $res, $mset, $q, $ctx) };
+ $cb = mset_thread($ctx, $mset, $q);
+ } else {
+ $cb = mset_summary($ctx, $mset, $q);
}
- dump_mset(\$res, $mset);
- $res .= '
' . search_nav_bot($mset, $q) .
- "\n\n" . foot($ctx);
}
+ PublicInbox::WwwStream->response($ctx, $code, $cb);
+}
- $res .= "