X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FEmlContentFoo.pm;h=c163eaf5183d4a8372be578b0a0ec23e05bcb4bd;hb=0d38f65c490466837ae091afa7a7b6f59d04ce7c;hp=f507d548898269034a0fc16b11c08a8552b6446b;hpb=88645f747bd43c7fc374d8bfb908dab4e6028825;p=public-inbox.git diff --git a/lib/PublicInbox/EmlContentFoo.pm b/lib/PublicInbox/EmlContentFoo.pm index f507d548..c163eaf5 100644 --- a/lib/PublicInbox/EmlContentFoo.pm +++ b/lib/PublicInbox/EmlContentFoo.pm @@ -9,15 +9,38 @@ # # This license differs from the rest of public-inbox # +# ABSTRACT: Parse a MIME Content-Type or Content-Disposition Header +# # This is a fork of the Email::MIME::ContentType 1.022 with # minor improvements and incompatibilities; namely changes to # quiet warnings with legacy data. package PublicInbox::EmlContentFoo; use strict; use parent qw(Exporter); -# ABSTRACT: Parse a MIME Content-Type or Content-Disposition Header +use v5.10.1; + +# find_mime_encoding() only appeared in Encode 2.87+ (Perl 5.26+), +# while we support 2.35 shipped with Perl 5.10.1 +use Encode 2.35 qw(find_encoding); +my %mime_name_map; # $enc->mime_name => $enc object +BEGIN { + eval { Encode->import('find_mime_encoding') }; + if ($@) { + *find_mime_encoding = sub { $mime_name_map{lc($_[0])} }; + %mime_name_map = map {; + my $enc = find_encoding($_); + my $m = lc($enc->mime_name // ''); + $m => $enc; + } Encode->encodings(':all'); + + # delete fallback for encodings w/o ->mime_name: + delete $mime_name_map{''}; + + # an extra alias see Encode::MIME::NAME + $mime_name_map{'utf8'} = find_encoding('UTF-8'); + } +} -use Encode 2.87 qw(find_mime_encoding); our @EXPORT_OK = qw(parse_content_type parse_content_disposition); our $STRICT_PARAMS = 1; @@ -79,11 +102,6 @@ sub parse_content_type { type => $type, subtype => $subtype, attributes => $attributes, - - # This is dumb. Really really dumb. For backcompat. -- rjbs, - # 2013-08-10 - discrete => $type, - composite => $subtype, }; } @@ -167,7 +185,7 @@ sub _process_rfc2231 { foreach (keys %{$attribs}) { next unless $_ =~ m/^(.*)\*$/; my $key = $1; - next unless $attribs->{$_} =~ m/^$re_exvalue$/; + next unless ($attribs->{$_} // '') =~ m/^$re_exvalue$/; my ($charset, $value) = ($1, $2); $value =~ s/%([0-9A-Fa-f]{2})/pack('C', hex($1))/eg; if (length $charset) { @@ -278,11 +296,6 @@ This routine parses email content type headers according to section 5.1 of RFC a hash as above, with entries for the C, the C, and a hash of C. -For backward compatibility with a really unfortunate misunderstanding of RFC -2045 by the early implementors of this module, C and C are -also present in the returned hashref, with the values of C and C -respectively. - =func parse_content_disposition This routine is exported by default.