]> Sergey Matveev's repositories - public-inbox.git/commitdiff
view: msg_html uses getline body to reduce latency
authorEric Wong <e@80x24.org>
Sun, 12 Jun 2016 04:46:38 +0000 (04:46 +0000)
committerEric Wong <e@80x24.org>
Mon, 13 Jun 2016 21:43:02 +0000 (21:43 +0000)
We need to ensure we show the message body ASAP since
the thread generation via Xapian could take a while
and maybe even raise an exception or crash.

lib/PublicInbox/View.pm
lib/PublicInbox/WWW.pm
t/view.t

index 2057faceccaf7214afd09503bc17445a157a5190..534f85ef9b8110ca86e992d18118be2499786309 100644 (file)
@@ -9,6 +9,7 @@ use warnings;
 use URI::Escape qw/uri_escape_utf8/;
 use Date::Parse qw/str2time/;
 use Encode::MIME::Header;
+use Plack::Util;
 use PublicInbox::Hval qw/ascii_html/;
 use PublicInbox::Linkify;
 use PublicInbox::MID qw/mid_clean id_compress mid2path mid_mime/;
@@ -26,12 +27,26 @@ sub msg_html {
        my ($ctx, $mime, $footer) = @_;
        $footer = defined($footer) ? "\n$footer" : '';
        my $hdr = $mime->header_obj;
-       headers_to_html_header($hdr, $ctx) .
-               multipart_text_as_html($mime, '') .
-               '</pre><hr /><pre>' .
-               html_footer($hdr, 1, $ctx) .
-               '</pre>' . msg_reply($ctx, $hdr) .
-               '<hr /><pre>'.  $footer . '</pre></body></html>';
+       my $n = 0;
+       Plack::Util::inline_object(
+               close => sub {}, # noop
+               getline => sub {
+                       my $nr = $n++;
+                       if ($nr == 0) {
+                               headers_to_html_header($hdr, $ctx) .
+                                       multipart_text_as_html($mime, '') .
+                                       '</pre><hr />'
+                       } elsif ($nr == 1) {
+                               '<pre>' .
+                                       html_footer($hdr, 1, $ctx) .
+                                       '</pre>' . msg_reply($ctx, $hdr) .
+                                       '<hr /><pre>'.  $footer .
+                                       '</pre></body></html>'
+                       } else {
+                               undef
+                       }
+               }
+       )
 }
 
 # /$INBOX/$MESSAGE_ID/#R
index 5fa4e3804e8e596a6500c1e397fa1dfbf810a055..c25deff3117dfe576ec33719b4bc2cc17befbf20 100644 (file)
@@ -228,7 +228,7 @@ sub get_mid_html {
        my $mime = Email::MIME->new($x);
        searcher($ctx);
        [ 200, [ 'Content-Type' => 'text/html; charset=UTF-8' ],
-         [ PublicInbox::View::msg_html($ctx, $mime, $foot) ] ];
+         PublicInbox::View::msg_html($ctx, $mime, $foot) ];
 }
 
 # /$INBOX/$MESSAGE_ID/t/
index 3332fb48b14bb82eaf01220a98b79743479c1668..6c0859915e89c9ae2d1384d69c2bd35a5c8d5ed0 100644 (file)
--- a/t/view.t
+++ b/t/view.t
@@ -9,7 +9,13 @@ use PublicInbox::View;
 sub msg_html ($) {
        my ($mime) = @_;
 
-       PublicInbox::View::msg_html(undef, $mime);
+       my $s = '';
+       my $body = PublicInbox::View::msg_html(undef, $mime);
+       while (defined(my $buf = $body->getline)) {
+               $s .= $buf;
+       }
+       $body->close;
+       $s;
 }
 
 # plain text