X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FEml.pm;h=8b999e1a88ef8d11b78e7c5bd0c022dbd7d0f7be;hb=5198c976ce8b1954f0f76a0da152cc434411f147;hp=69c26932f65162d76696a067c69243ef2f90e224;hpb=00d5dff2cce9d2c9b5720c0971ae3fd995c22c94;p=public-inbox.git diff --git a/lib/PublicInbox/Eml.pm b/lib/PublicInbox/Eml.pm index 69c26932..8b999e1a 100644 --- a/lib/PublicInbox/Eml.pm +++ b/lib/PublicInbox/Eml.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2020-2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # # Lazy MIME parser, it still slurps the full message but keeps short @@ -122,9 +122,10 @@ sub new { my $hdr = substr($$ref, 0, $header_size_limit + 1); hdr_truncate($hdr) if length($hdr) > $header_size_limit; bless { hdr => \$hdr, crlf => $1 }, __PACKAGE__; - } else { # nothing useful - my $hdr = $$ref = ''; - bless { hdr => \$hdr, crlf => "\n" }, __PACKAGE__; + } else { # just a body w/o header? + my $hdr = ''; + my $eol = ($$ref =~ /(\r?\n)/) ? $1 : "\n"; + bless { hdr => \$hdr, crlf => $eol, bdy => $ref }, __PACKAGE__; } } @@ -143,6 +144,7 @@ sub header_raw { my $re = re_memo($_[1]); my @v = (${ $_[0]->{hdr} } =~ /$re/g); for (@v) { + utf8::decode($_); # SMTPUTF8 # for compatibility w/ Email::Simple::Header, s/\s+\z//s; s/\A\s+//s; @@ -333,15 +335,18 @@ sub body_set { } sub body_str_set { - my ($self, $body_str) = @_; + my ($self, $str) = @_; my $cs = ct($self)->{attributes}->{charset} // croak('body_str was given, but no charset is defined'); my $enc = find_encoding($cs) // croak "unknown encoding `$cs'"; - $body_str = do { - local $SIG{__WARN__} = \&croak; - $enc->encode($body_str, Encode::FB_WARN); + my $tmp; + { + my @w; + local $SIG{__WARN__} = sub { push @w, @_ }; + $tmp = $enc->encode($str, Encode::FB_WARN); + croak(@w) if @w; }; - body_set($self, \$body_str); + body_set($self, \$tmp); } sub content_type { scalar header($_[0], 'Content-Type') } @@ -355,14 +360,15 @@ sub header_set { $pfx .= ': '; my $len = 78 - length($pfx); @vals = map {; + utf8::encode(my $v = $_); # to bytes, support SMTPUTF8 # folding differs from Email::Simple::Header, # we favor tabs for visibility (and space savings :P) if (length($_) >= $len && (/\n[^ \t]/s || !/\n/s)) { local $Text::Wrap::columns = $len; local $Text::Wrap::huge = 'overflow'; - $pfx . wrap('', "\t", $_) . $self->{crlf}; + $pfx . wrap('', "\t", $v) . $self->{crlf}; } else { - $pfx . $_ . $self->{crlf}; + $pfx . $v . $self->{crlf}; } } @vals; $$hdr =~ s!$re!shift(@vals) // ''!ge; # replace current headers, first @@ -466,8 +472,11 @@ sub body_str { my $enc = find_encoding($cs) or croak "unknown encoding `$cs'"; my $tmp = body($self); # workaround https://rt.cpan.org/Public/Bug/Display.html?id=139622 - local $SIG{__WARN__} = \&croak; - $enc->decode($tmp, Encode::FB_WARN); + my @w; + local $SIG{__WARN__} = sub { push @w, @_ }; + my $ret = $enc->decode($tmp, Encode::FB_WARN); + croak(@w) if @w; + $ret; } sub as_string {