X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FMbox.pm;h=c92d444774cef389fb6f35d0b38b4b3639377aba;hb=f76f265a851944b5dedcc3be5f3b5224b6ebda89;hp=cb9d65d1a9fb069b498ee4fe2161824aebb6fe51;hpb=ed724ad94ae8eccb7924584b01ec4975abfef48d;p=public-inbox.git diff --git a/lib/PublicInbox/Mbox.pm b/lib/PublicInbox/Mbox.pm index cb9d65d1..c92d4447 100644 --- a/lib/PublicInbox/Mbox.pm +++ b/lib/PublicInbox/Mbox.pm @@ -1,56 +1,75 @@ -# Copyright (C) 2015, all contributors +# Copyright (C) 2015 all contributors # License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) -# Streaming interface for formatting messages as an mbox +# Streaming interface for formatting messages as an mboxrd package PublicInbox::Mbox; use strict; use warnings; -use PublicInbox::MID qw/mid_clean mid_compressed mid2path/; -use Fcntl qw(SEEK_SET); +use PublicInbox::MID qw/mid2path/; +require Email::Simple; sub thread_mbox { - my ($ctx, $srch) = @_; + my ($ctx, $srch, $sfx) = @_; sub { my ($response) = @_; # Plack callback - emit_mbox($response, $ctx, $srch); + emit_mbox($response, $ctx, $srch, $sfx); + } +} + +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; } } sub emit_msg { my ($fh, $simple) = @_; # Email::Simple object + my $header_obj = $simple->header_obj; # drop potentially confusing headers, ssoma already should've dropped # Lines and Content-Length foreach my $d (qw(Lines Content-Length Status)) { - $simple->header_set($d); + $header_obj->header_set($d); } - my $buf = $simple->header_obj->as_string; + my $buf = $header_obj->as_string; unless ($buf =~ /\AFrom /) { - $fh->write("From a\@a Thu Jan 1 00:00:00 1970\n"); + $fh->write("From mboxrd\@z Thu Jan 1 00:00:00 1970\n"); } $fh->write($buf .= $simple->crlf); $buf = $simple->body; $simple->body_set(''); - $buf =~ s/^(From )/>$1/gm; + + # mboxrd quoting style + # ref: http://www.qmail.org/man/man5/mbox.html + $buf =~ s/^(>*From )/>$1/gm; + $buf .= "\n" unless $buf =~ /\n\z/s; $fh->write($buf); } sub emit_mbox { - my ($response, $ctx, $srch) = @_; - eval { require IO::Compress::Gzip }; - return need_gzip($response) if $@; + my ($response, $ctx, $srch, $sfx) = @_; + my $type = 'mbox'; + if ($sfx) { + eval { require IO::Compress::Gzip }; + return need_gzip($response) if $@; + $type = 'gzip'; + } # http://www.iana.org/assignments/media-types/application/gzip # http://www.iana.org/assignments/media-types/application/mbox - my $fh = $response->([200, ['Content-Type' => 'application/gzip']]); - $fh = PublicInbox::MboxGz->new($fh); + my $fh = $response->([200, ['Content-Type' => "application/$type"]]); + $fh = PublicInbox::MboxGz->new($fh) if $sfx; require PublicInbox::GitCatFile; - require Email::Simple; - my $mid = mid_compressed($ctx->{mid}); + my $mid = $ctx->{mid}; my $git = PublicInbox::GitCatFile->new($ctx->{git_dir}); my %opts = (offset => 0); my $nr; @@ -81,6 +100,7 @@ The administrator needs to install the IO::Compress::Gzip Perl module to support gzipped mboxes. Return to index EOF + $fh->close; } 1; @@ -119,7 +139,7 @@ sub close { my ($self) = @_; $self->{gz}->close; _flush_buf($self); - # do not actually close $fh + $self->{fh}->close; } 1;