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 | 27 +++++++++++++++++++++------
 lib/PublicInbox/WWW.pm  |  2 +-
 t/view.t                |  8 +++++++-
 3 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 2057fac..534f85e 100644
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@ -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
diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm
index 5fa4e38..c25deff 100644
--- a/lib/PublicInbox/WWW.pm
+++ b/lib/PublicInbox/WWW.pm
@@ -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/
diff --git a/t/view.t b/t/view.t
index 3332fb4..6c08599 100644
--- 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
--
unsubscribe: meta+unsubscr...@public-inbox.org
archive: https://public-inbox.org/meta/

Reply via email to