-sub emit1 {
- my $simple = Email::Simple->new(pop);
- sub {
- my ($response) = @_;
- # single message should be easily renderable in browsers
- my $fh = $response->([200, ['Content-Type'=>'text/plain']]);
- emit_msg($fh, $simple);
- $fh->close;
+# called by PublicInbox::DS::write after http->next_step
+sub async_next {
+ my ($http) = @_; # PublicInbox::HTTP
+ my $ctx = $http->{forward} or return; # client aborted
+ eval {
+ my $smsg = $ctx->{smsg} or return $ctx->close;
+ $ctx->smsg_blob($smsg);
+ };
+ warn "E: $@" if $@;
+}
+
+sub async_eml { # for async_blob_cb
+ my ($ctx, $eml) = @_;
+ my $smsg = delete $ctx->{smsg};
+ # next message
+ $ctx->{smsg} = $ctx->{-inbox}->over->next_by_mid(@{$ctx->{next_arg}});
+
+ $ctx->zmore(msg_hdr($ctx, $eml, $smsg->{mid}));
+ $ctx->{http_out}->write($ctx->translate(msg_body($eml)));
+}
+
+sub res_hdr ($$) {
+ my ($ctx, $subject) = @_;
+ my $fn = $subject // '';
+ $fn =~ s/^re:\s+//i;
+ $fn = to_filename($fn) // 'no-subject';
+ my @hdr = ('Content-Type');
+ if ($ctx->{-inbox}->{obfuscate}) {
+ # obfuscation is stupid, but maybe scrapers are, too...
+ push @hdr, 'application/mbox';
+ $fn .= '.mbox';
+ } else {
+ push @hdr, 'text/plain';
+ $fn .= '.txt';