summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorKartikaya Gupta <kats@seldon.staktrace.com>2016-05-28 02:18:23 -0400
committerKartikaya Gupta <kats@seldon.staktrace.com>2016-05-28 02:22:44 -0400
commitd2b8a3bcc63a93a7ddf7ece26e3d25876a37675a (patch)
tree5791668a58a07bec051ece200c0a86811fbcde36 /src/lib.rs
parent32e022d821416f08531bb4a4fee2d102ddd04c40 (diff)
Add a function to parse multiple headers
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
index c7bd77c..7822fe9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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);
+ }
}