-use PublicInbox::MID qw/mid_clean/;
-use URI::Escape qw/uri_escape_utf8/;
-use Plack::Util;
-require Email::Simple;
-
-sub emit1 {
- my ($ctx, $msg) = @_;
- $msg = Email::Simple->new($msg);
- # single message should be easily renderable in browsers
- [200, ['Content-Type', 'text/plain'], [ msg_str($ctx, $msg)] ]
+use PublicInbox::MID qw/mid_clean mid_escape/;
+use PublicInbox::Hval qw/to_filename/;
+use Email::Simple;
+use Email::MIME::Encode;
+
+sub subject_fn ($) {
+ my ($hdr) = @_;
+ my $fn = $hdr->header('Subject');
+ return 'no-subject' unless defined($fn);
+
+ # no need for full Email::MIME, here
+ if ($fn =~ /=\?/) {
+ eval { $fn = Encode::decode('MIME-Header', $fn) };
+ $fn = 'no-subject' if $@;
+ }
+ $fn =~ s/^re:\s+//i;
+ $fn = to_filename($fn);
+ $fn eq '' ? 'no-subject' : $fn;
+}
+
+sub mb_stream {
+ my ($more) = @_;
+ bless $more, 'PublicInbox::Mbox';
+}
+
+# called by PSGI server as body response
+# this gets called twice for every message, once to return the header,
+# once to retrieve the body
+sub getline {
+ my ($more) = @_; # self
+ my ($ctx, $id, $prev, $next, $mref, $hdr) = @$more;
+ if ($hdr) { # first message hits this, only
+ pop @$more; # $hdr
+ return msg_hdr($ctx, $hdr);
+ }
+ if ($mref) { # all messages hit this
+ pop @$more; # $mref
+ return msg_body($$mref);
+ }
+ my $cur = $next or return;
+ my $ibx = $ctx->{-inbox};
+ $next = $ibx->over->next_by_mid($ctx->{mid}, \$id, \$prev);
+ $mref = $ibx->msg_by_smsg($cur) or return;
+ $hdr = Email::Simple->new($mref)->header_obj;
+ @$more = ($ctx, $id, $prev, $next, $mref); # $next may be undef, here
+ msg_hdr($ctx, $hdr); # all but first message hits this