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 .= '
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 {