lib/PublicInbox/Eml.pm | 20 +++++++++++++------- diff --git a/lib/PublicInbox/Eml.pm b/lib/PublicInbox/Eml.pm index 69c26932f65162d76696a067c69243ef2f90e224..3c681ba5bc2eb6efc6b0252b67a26ebd2f3b6904 100644 --- a/lib/PublicInbox/Eml.pm +++ b/lib/PublicInbox/Eml.pm @@ -333,15 +333,18 @@ undef; } 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') } @@ -466,8 +469,11 @@ }; 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 {