From 9f8013c21fca547fdb6058080ced55e7adc10d38 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Sun, 4 Dec 2016 02:46:33 -0500 Subject: Fix for issue #7 - deal with lack of headers --- src/lib.rs | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 46d0530..6ba0ce3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -256,6 +256,7 @@ impl<'a> MailHeader<'a> { } } +#[derive(Debug)] enum HeaderParseState { Initial, Key, @@ -446,12 +447,7 @@ pub fn parse_headers(raw_data: &[u8]) -> Result<(Vec, usize), MailPa let mut headers: Vec = Vec::new(); let mut ix = 0; loop { - let (header, ix_next) = try!(parse_header(&raw_data[ix..])); - headers.push(header); - ix = ix + ix_next; - if ix >= raw_data.len() { - break; - } else if raw_data[ix] == b'\n' { + if raw_data[ix] == b'\n' { ix = ix + 1; break; } else if raw_data[ix] == b'\r' { @@ -463,6 +459,12 @@ pub fn parse_headers(raw_data: &[u8]) -> Result<(Vec, usize), MailPa CR character!")); } } + let (header, ix_next) = try!(parse_header(&raw_data[ix..])); + headers.push(header); + ix = ix + ix_next; + if ix >= raw_data.len() { + break; + } } Ok((headers, ix)) } @@ -957,4 +959,21 @@ mod tests { assert_eq!(parsed.headers[0].get_key().unwrap(), "Content-Type"); assert_eq!(parsed.get_body().unwrap(), ""); } + + #[test] + fn test_no_headers_in_subpart() { + let mail = parse_mail(concat!( + "Content-Type: multipart/report; report-type=delivery-status;\n", + "\tboundary=\"1404630116.22555.postech.q0.x.x.x\"\n", + "\n", + "--1404630116.22555.postech.q0.x.x.x\n", + "\n", + "--1404630116.22555.postech.q0.x.x.x--\n") + .as_bytes()) + .unwrap(); + assert_eq!(mail.ctype.mimetype, "multipart/report"); + assert_eq!(mail.subparts[0].headers.len(), 0); + assert_eq!(mail.subparts[0].ctype.mimetype, "text/plain"); + assert_eq!(mail.subparts[0].get_body().unwrap(), ""); + } } -- cgit v1.2.3