X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FWwwListing.pm;h=21e5b8bc8121040e9bd467d4cd30d7ca0baa654e;hb=HEAD;hp=1bb5fbd041587cbc3931d370fcecde9519d5ff6e;hpb=733a7405f5a9d24782093876f178c6eb954dc17c;p=public-inbox.git diff --git a/lib/PublicInbox/WwwListing.pm b/lib/PublicInbox/WwwListing.pm index 1bb5fbd0..21e5b8bc 100644 --- a/lib/PublicInbox/WwwListing.pm +++ b/lib/PublicInbox/WwwListing.pm @@ -11,13 +11,14 @@ use PublicInbox::GzipFilter qw(gzf_maybe); use PublicInbox::ConfigIter; use PublicInbox::WwwStream; use URI::Escape qw(uri_escape_utf8); +use PublicInbox::MID qw(mid_escape); sub ibx_entry { my ($ctx, $ibx, $ce) = @_; my $desc = ascii_html($ce->{description} //= $ibx->description); my $ts = fmt_ts($ce->{-modified} //= $ibx->modified); my ($url, $href); - if (defined($ibx->{url})) { + if (scalar(@{$ibx->{url} // []})) { $url = $href = ascii_html(prurl($ctx->{env}, $ibx->{url})); } else { $href = ascii_html(uri_escape_utf8($ibx->{name})) . '/'; @@ -41,7 +42,7 @@ sub list_match_i { # ConfigIter callback return if $section !~ m!\Apublicinbox\.([^/]+)\z!; my $ibx = $cfg->lookup_name($1) or return; if (!$ibx->{-hide}->{$ctx->hide_key} && - grep(/$re/, @{$ibx->{url}})) { + grep(/$re/, @{$ibx->{url} // []})) { $ctx->ibx_entry($ibx); } } else { # undef == "EOF" @@ -135,6 +136,13 @@ sub response { my ($re, $qs) = $ctx->url_filter; $re // return $ctx->psgi_triple; if (my $ALL = $ctx->{www}->{pi_cfg}->ALL) { # fast path + if ($ctx->{qp}->{a} && # "search all inboxes" + $ctx->{qp}->{'q'}) { + my $u = 'all/?q='.mid_escape($ctx->{qp}->{'q'}); + return [ 302, [ 'Location' => $u, + qw(Content-Type text/plain) ], + [ "Redirecting to $u\n" ] ]; + } # FIXME: test this in t/ $ALL->misc->reopen->retry_reopen(\&add_misc_ibx, $ctx, $re, $qs); @@ -154,25 +162,22 @@ sub mset_footer ($$) { # no footer if too few matches return '' if $mset->get_matches_estimated == $mset->size; require PublicInbox::SearchView; - PublicInbox::SearchView::search_nav_bot($mset, $ctx->{-sq}); + PublicInbox::SearchView::search_nav_bot($ctx, $mset, $ctx->{-sq}); } sub mset_nav_top { my ($ctx, $mset) = @_; my $q = $ctx->{-sq}; my $qh = $q->{'q'} // ''; - utf8::decode($qh); - $qh = ascii_html($qh); - $qh = qq[\nvalue="$qh"] if $qh ne ''; - my $rv = <
+	if ($qh ne '') {
+		utf8::decode($qh);
+		$qh = qq[\nvalue="].ascii_html($qh).'"';
+	}
+	chop(my $rv = <
 EOM
-	chomp $rv;
 	if (defined($q->{'q'})) {
 		my $initial_q = $ctx->{-uxs_retried};
 		if (defined $initial_q) {
@@ -203,31 +208,32 @@ sub psgi_triple {
 	my $h = [ 'Content-Type', 'text/html; charset=UTF-8',
 			'Content-Length', undef ];
 	my $gzf = gzf_maybe($h, $ctx->{env});
-	$gzf->zmore('public-inbox listing' .
-			$ctx->{www}->style('+/') .
-			'');
+	my $zfh = $gzf->zfh;
+	print $zfh 'public-inbox listing',
+			$ctx->{www}->style('+/'),
+			'';
 	my $code = 404;
 	if (my $list = delete $ctx->{-list}) {
 		my $mset = delete $ctx->{-mset};
 		$code = 200;
 		if ($mset) { # already sorted, so search bar:
-			$gzf->zmore(mset_nav_top($ctx, $mset));
+			print $zfh mset_nav_top($ctx, $mset);
 		} else { # sort config dump by ->modified
 			@$list = map { $_->[1] }
 				sort { $b->[0] <=> $a->[0] } @$list;
 		}
-		$gzf->zmore('
');
-		$gzf->zmore(join("\n", @$list));
-		$gzf->zmore(mset_footer($ctx, $mset)) if $mset;
+		print $zfh '
', join("\n", @$list); # big
+		print $zfh mset_footer($ctx, $mset) if $mset;
 	} elsif (my $mset = delete $ctx->{-mset}) {
-		$gzf->zmore(mset_nav_top($ctx, $mset));
-		$gzf->zmore('
no matching inboxes');
-		$gzf->zmore(mset_footer($ctx, $mset));
+		print $zfh mset_nav_top($ctx, $mset),
+				'
no matching inboxes',
+				mset_footer($ctx, $mset);
 	} else {
-		$gzf->zmore('
no inboxes, yet');
+		print $zfh '
no inboxes, yet';
 	}
 	my $out = $gzf->zflush('

'.
-			PublicInbox::WwwStream::code_footer($ctx->{env}) .
+qq(This is a listing of public inboxes, see the `mirror' link of each inbox
+for instructions on how to mirror all the data and code on this site.) .
 			'
'); $h->[3] = length($out); [ $code, $h, [ $out ] ];