diff options
author | Kartikaya Gupta <kats@seldon.staktrace.com> | 2016-05-28 02:18:23 -0400 |
---|---|---|
committer | Kartikaya Gupta <kats@seldon.staktrace.com> | 2016-05-28 02:22:44 -0400 |
commit | d2b8a3bcc63a93a7ddf7ece26e3d25876a37675a (patch) | |
tree | 5791668a58a07bec051ece200c0a86811fbcde36 /src/lib.rs | |
parent | 32e022d821416f08531bb4a4fee2d102ddd04c40 (diff) |
Add a function to parse multiple headers
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 64 |
1 files changed, 64 insertions, 0 deletions
@@ -109,6 +109,23 @@ pub fn parse_header(raw_data: &str) -> Result<(MailHeader, usize), MailParseErro } } +pub fn parse_headers(raw_data: &str) -> Result<Vec<MailHeader>, MailParseError> { + let mut headers: Vec<MailHeader> = Vec::new(); + let mut ix = 0; + loop { + let (header, ix_end) = match parse_header(&raw_data[ix..]) { + Ok(v) => v, + Err(e) => return Err(MailParseError {description: e.description, position: e.position + ix}), + }; + headers.push(header); + ix = ix + ix_end; + if ix >= raw_data.len() || raw_data.chars().nth(ix) == Some('\n') { + break; + } + } + Ok(headers) +} + #[cfg(test)] mod tests { use super::*; @@ -147,4 +164,51 @@ mod tests { parse_header("Just a string").unwrap_err(); parse_header("Key\nBroken: Value").unwrap_err(); } + + #[test] + fn parse_multiple_headers() { + let parsed = parse_headers("Key: Value\nTwo: Second").unwrap(); + assert_eq!(parsed.len(), 2); + assert_eq!(parsed[0].key, "Key"); + assert_eq!(parsed[0].value, "Value"); + assert_eq!(parsed[1].key, "Two"); + assert_eq!(parsed[1].value, "Second"); + + let parsed = parse_headers("Key: Value\n Overhang\nTwo: Second\nThree: Third").unwrap(); + assert_eq!(parsed.len(), 3); + assert_eq!(parsed[0].key, "Key"); + assert_eq!(parsed[0].value, "Value\n Overhang"); + assert_eq!(parsed[1].key, "Two"); + assert_eq!(parsed[1].value, "Second"); + assert_eq!(parsed[2].key, "Three"); + assert_eq!(parsed[2].value, "Third"); + + let parsed = parse_headers("Key: Value\nTwo: Second\n\nBody").unwrap(); + assert_eq!(parsed.len(), 2); + assert_eq!(parsed[0].key, "Key"); + assert_eq!(parsed[0].value, "Value"); + assert_eq!(parsed[1].key, "Two"); + assert_eq!(parsed[1].value, "Second"); + + let parsed = parse_headers("Return-Path: <kats@foobar.staktrace.com>\n\ + X-Original-To: kats@baz.staktrace.com\n\ + Delivered-To: kats@baz.staktrace.com\n\ + Received: from foobar.staktrace.com (localhost [127.0.0.1])\n \ + by foobar.staktrace.com (Postfix) with ESMTP id 139F711C1C34\n \ + for <kats@baz.staktrace.com>; Fri, 27 May 2016 02:34:26 -0400 (EDT)\n\ + Date: Fri, 27 May 2016 02:34:25 -0400\n\ + To: kats@baz.staktrace.com\n\ + From: kats@foobar.staktrace.com\n\ + Subject: test Fri, 27 May 2016 02:34:25 -0400\n\ + X-Mailer: swaks v20130209.0 jetmore.org/john/code/swaks/\n\ + Message-Id: <20160527063426.139F711C1C34@foobar.staktrace.com>\n\ + \n\ + This is a test mailing\n").unwrap(); + assert_eq!(parsed.len(), 10); + assert_eq!(parsed[0].key, "Return-Path"); + assert_eq!(parsed[9].key, "Message-Id"); + + assert_eq!(parse_headers("Bad\nKey").unwrap_err().position, 3); + assert_eq!(parse_headers("K:V\nBad\nKey").unwrap_err().position, 7); + } } |