Samuel GROOT <samuel.gr...@grenoble-inp.org> writes:

> +sub parse_email {
> +     my %mail = ();
> +     my $fh = shift;
> +     my $last_header;

> +     # Unfold and parse multiline header fields
> +     while (<$fh>) {
> +             last if /^\s*$/;

You stop at the end of fields before the message body starts.

> +             s/\r\n|\n|\r//;

The pattern is not anchored at the right end of the string;
intended?  Is it worth worrying about a lone '\r'?

> +             if (/^([^\s:]+):[\s]+(.*)$/) {
> +                     $last_header = lc($1);
> +                     @{$mail{$last_header}} = ()
> +                             unless defined $mail{$last_header};
> +                     push @{$mail{$last_header}}, $2;

> +             } elsif (/^\s+\S/ and defined $last_header) {
> +                     s/^\s+/ /;
> +                     push @{$mail{$last_header}}, $_;

Even though the comment said "unfold", you do not really do the
unfolding here and the caller can (if it wants to) figure out where
one logical header was folded in the original into multiple physical
lines, because you are returning an arrayref.

However, that means the caller still cannot tell what the original
was if you are given:

        X-header: a b
            c
        X-header: d

as you would return { 'X-header' => ["a b", "c", "d")] }

In that sense, it may be better to do a real unfolding here, so that
it would return { 'X-header' => ["a b c", "d"] } from here instead?

I.e. instead of "push @{...}, $_", append $_ to the last element of
that array?

> +             } else {
> +                     die("Mail format undefined!\n");

What does that mean?  It would probably help if you included the
line that the code did not understand in the message.


> +             }
> +     }
> +
> +     # Separate body from header
> +     $mail{"body"} = [(<$fh>)];
> +
> +     return \%mail;

The name of the local thing is not observable from the caller, but
because this is "parse-email-header" and returns "header fields"
without reading the "mail", perhaps call it %header instead?

> +}
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to