lib/PublicInbox/View.pm | 42 ++++++++++++++++++------------------------ lib/PublicInbox/WwwStream.pm | 14 ++++++++++++-- diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 446e6bb84ee18dee7a6cc1385211e0d72550ae8c..033af283b587ae422cd79eeedcd6261b50837ddd 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -38,14 +38,12 @@ $ctx->{smsg} = $over ? $over->next_by_mid(@{$ctx->{next_arg}}) : $ctx->gone('over'); $ctx->{mhref} = ($ctx->{nr} || $ctx->{smsg}) ? "../${\mid_href($smsg->{mid})}/" : ''; - my $obuf = _msg_page_prepare_obuf($eml, $ctx); - if (length($$obuf)) { + if (_msg_page_prepare_obuf($eml, $ctx)) { multipart_text_as_html($eml, $ctx); - $$obuf .= '
'; + ${$ctx->{obuf}} .= '
'; } - delete $ctx->{obuf}; - $$obuf .= html_footer($ctx, $ctx->{first_hdr}) if !$ctx->{smsg}; - $$obuf; + html_footer($ctx, $ctx->{first_hdr}) if !$ctx->{smsg}; + delete($ctx->{obuf}) // \''; } else { # called by WwwStream::async_next or getline $ctx->{smsg}; # may be undef } @@ -58,14 +56,12 @@ my $bref = $ctx->{ibx}->msg_by_mid($ctx->{mid}) or return; # 404 my $eml = PublicInbox::Eml->new($bref); $ctx->{mhref} = ''; PublicInbox::WwwStream::init($ctx); - my $obuf = _msg_page_prepare_obuf($eml, $ctx); - if (length($$obuf)) { + if (_msg_page_prepare_obuf($eml, $ctx)) { # sets {-title_html} multipart_text_as_html($eml, $ctx); - $$obuf .= '
'; + ${$ctx->{obuf}} .= '
'; } - delete $ctx->{obuf}; - eval { $$obuf .= html_footer($ctx, $eml) }; - html_oneshot($ctx, 200, $$obuf); + html_footer($ctx, $eml); + $ctx->html_done(200); } # public functions: (unstable) @@ -669,7 +665,7 @@ my $nr = $ctx->{nr}++; if ($nr) { # unlikely if ($ctx->{chash} eq content_hash($eml)) { warn "W: BUG? @$mids not deduplicated properly\n"; - return \$rv; + return; } $rv .= "
WARNING: multiple messages have this Message-ID\n
";
@@ -746,7 +742,7 @@ 		$rv .= $s;
 	}
 	_parent_headers($ctx, $eml);
 	$rv .= "\n";
-	\$rv;
+	1;
 }
 
 sub SKEL_EXPAND () {
@@ -827,13 +823,11 @@ 		${$ctx->{obuf}} .= 'References: '. join("\n\t", @$refs) . "\n";
 	}
 }
 
-# returns a string buffer
+# appends to obuf
 sub html_footer {
 	my ($ctx, $hdr) = @_;
 	my $upfx = '../';
-	my $skel;
-	my $rv = '
';
-	my $related;
+	my ($related, $skel);
 	my $qry = delete $ctx->{-qry};
 	if ($qry && $ctx->{ibx}->isrch) {
 		my $q = ''; # search for either ancestor or descendent patches
@@ -896,15 +890,15 @@ 			}
 		} elsif ($u) { # unlikely
 			$parent = " parent";
 		}
-		$rv .= "$next $prev$parent ";
+		${$ctx->{obuf}} .= "
$next $prev$parent ";
 	} else { # unindexed inboxes w/o over
+		${$ctx->{obuf}} .= '
';
 		$skel = qq( latest);
 	}
-	$rv .= qq(reply);
-	$rv .= $skel;
-	$rv .= '
'; - $rv .= $related // ''; - $rv .= msg_reply($ctx, $hdr); + ${$ctx->{obuf}} .= qq(reply); + # $skel may be big for big threads, don't append it to obuf + $skel .= '
' . ($related // ''); + $ctx->zmore($skel .= msg_reply($ctx, $hdr)); # flushes obuf } sub linkify_ref_no_over { diff --git a/lib/PublicInbox/WwwStream.pm b/lib/PublicInbox/WwwStream.pm index f2777fdc64f8a33fdaa945db9f7eded819514dc2..115e04407f1c022624ee22040e6ea6c06a0b1fc7 100644 --- a/lib/PublicInbox/WwwStream.pm +++ b/lib/PublicInbox/WwwStream.pm @@ -27,6 +27,9 @@ sub init { my ($ctx, $cb) = @_; $ctx->{cb} = $cb; $ctx->{base_url} = base_url($ctx); + $ctx->{-res_hdr} = [ 'Content-Type' => 'text/html; charset=UTF-8' ]; + $ctx->{gz} = PublicInbox::GzipFilter::gz_or_noop($ctx->{-res_hdr}, + $ctx->{env}); bless $ctx, __PACKAGE__; } @@ -164,6 +167,14 @@ delete $ctx->{cb}; $ctx->zflush(_html_end($ctx)); } +sub html_done ($$) { + my ($ctx, $code) = @_; + my $bdy = $ctx->zflush(_html_end($ctx)); + my $res_hdr = delete $ctx->{-res_hdr}; + push @$res_hdr, 'Content-Length', length($bdy); + [ $code, $res_hdr, [ $bdy ] ] +} + sub html_oneshot ($$;@) { my ($ctx, $code) = @_[0, 1]; my $res_hdr = [ 'Content-Type' => 'text/html; charset=UTF-8', @@ -195,9 +206,8 @@ } sub aresponse { my ($ctx, $code, $cb) = @_; - my $res_hdr = [ 'Content-Type' => 'text/html; charset=UTF-8' ]; init($ctx, $cb); - $ctx->psgi_response($code, $res_hdr); + $ctx->psgi_response($code, delete $ctx->{-res_hdr}); } sub html_init {