]> Sergey Matveev's repositories - public-inbox.git/commitdiff
view: rework single message page to compress earlier
authorEric Wong <e@80x24.org>
Sat, 10 Sep 2022 08:16:54 +0000 (08:16 +0000)
committerEric Wong <e@80x24.org>
Sat, 10 Sep 2022 19:50:26 +0000 (19:50 +0000)
We can rely on deflate to compress large thread skeletons on
single message pages.  Subsequent commits will compress bodies,
as well.

lib/PublicInbox/View.pm
lib/PublicInbox/WwwStream.pm

index 446e6bb84ee18dee7a6cc1385211e0d72550ae8c..033af283b587ae422cd79eeedcd6261b50837ddd 100644 (file)
@@ -38,14 +38,12 @@ sub msg_page_i {
                                : $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 .= '</pre><hr>';
+                       ${$ctx->{obuf}} .= '</pre><hr>';
                }
-               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 @@ sub no_over_html ($) {
        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 .= '</pre><hr>';
+               ${$ctx->{obuf}} .= '</pre><hr>';
        }
-       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 @@ sub _msg_page_prepare_obuf {
        if ($nr) { # unlikely
                if ($ctx->{chash} eq content_hash($eml)) {
                        warn "W: BUG? @$mids not deduplicated properly\n";
-                       return \$rv;
+                       return;
                }
                $rv .=
 "<pre>WARNING: multiple messages have this Message-ID\n</pre><pre>";
@@ -746,7 +742,7 @@ sub _msg_page_prepare_obuf {
        }
        _parent_headers($ctx, $eml);
        $rv .= "\n";
-       \$rv;
+       1;
 }
 
 sub SKEL_EXPAND () {
@@ -827,13 +823,11 @@ EOM
        }
 }
 
-# returns a string buffer
+# appends to obuf
 sub html_footer {
        my ($ctx, $hdr) = @_;
        my $upfx = '../';
-       my $skel;
-       my $rv = '<pre>';
-       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 @@ EOF
                } elsif ($u) { # unlikely
                        $parent = " <a\nhref=\"$u\"\nrel=prev>parent</a>";
                }
-               $rv .= "$next $prev$parent ";
+               ${$ctx->{obuf}} .= "<pre>$next $prev$parent ";
        } else { # unindexed inboxes w/o over
+               ${$ctx->{obuf}} .= '<pre>';
                $skel = qq( <a\nhref="$upfx">latest</a>);
        }
-       $rv .= qq(<a\nhref="#R">reply</a>);
-       $rv .= $skel;
-       $rv .= '</pre>';
-       $rv .= $related // '';
-       $rv .= msg_reply($ctx, $hdr);
+       ${$ctx->{obuf}} .= qq(<a\nhref="#R">reply</a>);
+       # $skel may be big for big threads, don't append it to obuf
+       $skel .= '</pre>' . ($related // '');
+       $ctx->zmore($skel .= msg_reply($ctx, $hdr)); # flushes obuf
 }
 
 sub linkify_ref_no_over {
index f2777fdc64f8a33fdaa945db9f7eded819514dc2..115e04407f1c022624ee22040e6ea6c06a0b1fc7 100644 (file)
@@ -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 @@ sub getline {
        $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 async_next ($) {
 
 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 {