From 357662d6518e2703899f70251f0f5c0fe49b0386 Mon Sep 17 00:00:00 2001 From: Don Armstrong Date: Tue, 28 Feb 2017 18:34:55 -0800 Subject: [PATCH] abstract out parse_to_mime_entity into Debbugs::MIME --- Debbugs/CGI/Bugreport.pm | 14 ++------------ Debbugs/MIME.pm | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/Debbugs/CGI/Bugreport.pm b/Debbugs/CGI/Bugreport.pm index 9ca67ed..fe037f0 100644 --- a/Debbugs/CGI/Bugreport.pm +++ b/Debbugs/CGI/Bugreport.pm @@ -34,7 +34,7 @@ use IO::Scalar; use Params::Validate qw(validate_with :types); use Digest::MD5 qw(md5_hex); use Debbugs::Mail qw(get_addresses :reply); -use Debbugs::MIME qw(decode_rfc1522 create_mime_message); +use Debbugs::MIME qw(decode_rfc1522 create_mime_message parse_to_mime_entity); use Debbugs::CGI qw(:url :html :util); use Debbugs::Common qw(globify_scalar english_join); use Debbugs::UTF8; @@ -321,17 +321,7 @@ sub handle_email_message{ my $entity; my $tempdir; if (not blessed $record) { - my $parser = MIME::Parser->new(); - # this will be cleaned up once it goes out of scope - $tempdir = File::Temp->newdir(); - $parser->output_under($tempdir->dirname()); - if ($record->{inner_file}) { - $entity = $parser->parse($record->{fh}) or - die "Unable to parse entity"; - } else { - $entity = $parser->parse_data($record->{text}) or - die "Unable to parse entity"; - } + $entity = parse_to_mime_entity($record); } else { $entity = $record; } diff --git a/Debbugs/MIME.pm b/Debbugs/MIME.pm index f114c68..bb7a2cd 100644 --- a/Debbugs/MIME.pm +++ b/Debbugs/MIME.pm @@ -88,6 +88,43 @@ sub getmailbody return undef; } +=item parse_to_mime_entity + + $entity = parse_to_mime_entity($record); + +Returns a MIME::Entity from a record (from Debbugs::Log), a filehandle, or a +scalar mail message. Will die upon failure. + +Intermediate parsing results will be output under a temporary directory which +should be cleaned up upon process exit. + +=cut + +sub parse_to_mime_entity { + my ($record) = @_; + my $parser = MIME::Parser->new(); + my $entity; + # this will be cleaned up once we exit + $tempdir = File::Temp->newdir(); + $parser->output_dir($tempdir->dirname()); + if (ref($record) eq 'HASH') { + if ($record->{inner_file}) { + $entity = $parser->parse($record->{fh}) or + die "Unable to parse entity"; + } else { + $entity = $parser->parse_data($record->{text}) or + die "Unable to parse entity"; + } + } elsif (ref($record)) { + $entity = $parser->parse($record) or + die "Unable to parse entity"; + } else { + $entity = $parser->parse_data($record) or + die "Unable to parse entity"; + } + return $entity; +} + sub parse { # header and decoded body respectively -- 2.39.2