-# Copyright (C) 2015-2019 all contributors <meta@public-inbox.org>
+# Copyright (C) 2015-2020 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# Streaming (via getline) interface for formatting messages as an mboxrd.
use warnings;
use PublicInbox::MID qw/mid_escape/;
use PublicInbox::Hval qw/to_filename/;
+use PublicInbox::Smsg;
+use PublicInbox::WwwStream qw(html_oneshot);
use Email::Simple;
use Email::MIME::Encode;
# no need for full Email::MIME, here
if ($fn =~ /=\?/) {
eval { $fn = Encode::decode('MIME-Header', $fn) };
- $fn = 'no-subject' if $@;
+ return 'no-subject' if $@;
}
$fn =~ s/^re:\s+//i;
- $fn = to_filename($fn);
- $fn eq '' ? 'no-subject' : $fn;
+ $fn eq '' ? 'no-subject' : to_filename($fn);
}
sub mb_stream {
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);
+ return msg_hdr($ctx, $hdr) . 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
+ @$more = ($ctx, $id, $prev, $next); # $next may be undef, here
+ msg_hdr($ctx, $hdr) . msg_body($$mref);
}
sub close {} # noop
sub thread_mbox {
my ($ctx, $over, $sfx) = @_;
eval { require PublicInbox::MboxGz };
- return need_gzip() if $@;
+ return need_gzip($ctx) if $@;
my $msgs = $ctx->{msgs} = $over->get_thread($ctx->{mid}, {});
return [404, [qw(Content-Type text/plain)], []] if !@$msgs;
$ctx->{prev} = $msgs->[-1];
my $srch = $ctx->{srch};
while (1) {
while (my $mi = (($mset->items)[$ctx->{iter}++])) {
- my $doc = $mi->get_document;
- my $smsg = $srch->retry_reopen(sub {
- PublicInbox::SearchMsg->load_doc($doc);
- }) or next;
+ my $smsg = PublicInbox::Smsg::from_mitem($mi,
+ $srch) or next;
return $smsg;
}
# refill result set
my ($ctx, $query) = @_;
eval { require PublicInbox::MboxGz };
- return need_gzip() if $@;
+ return need_gzip($ctx) if $@;
return mbox_all_ids($ctx) if $query eq '';
my $qopts = $ctx->{qopts} = { mset => 2 };
my $srch = $ctx->{srch} = $ctx->{-inbox}->search or
}
sub need_gzip {
- my $title = 'gzipped mbox not available';
- my $body = <<EOF;
-<html><head><title>$title</title><body><pre>$title
+ html_oneshot($_[0], 501, \<<EOF);
+<pre>gzipped mbox not available
+
The administrator needs to install the Compress::Raw::Zlib Perl module
to support gzipped mboxes.
-<a href="../">Return to index</a></pre></body></html>
-EOF
- [501,[qw(Content-Type text/html Content-Length), bytes::length($body)],
- [ $body ] ];
+<a href="../">Return to index</a></pre>
+EOF
}
1;