about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/View.pm27
-rw-r--r--lib/PublicInbox/WWW.pm2
-rw-r--r--t/view.t8
3 files changed, 29 insertions, 8 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm
index 2057face..534f85ef 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 5fa4e380..c25deff3 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 3332fb48..6c085991 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