From 69f552dbcbe1d88f4813a423e99dc39e8d14e091 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Sun, 4 Dec 2016 02:49:24 -0500 Subject: Update documentation --- target/doc/implementors/core/convert/trait.From.js | 2 +- target/doc/implementors/core/fmt/trait.Debug.js | 2 +- target/doc/implementors/core/fmt/trait.Display.js | 2 +- .../implementors/mailparse/trait.MailHeaderMap.js | 2 +- target/doc/implementors/std/error/trait.Error.js | 2 +- target/doc/mailparse/enum.MailParseError.html | 2 +- target/doc/mailparse/fn.dateparse.html | 2 +- target/doc/mailparse/fn.parse_content_type.html | 2 +- target/doc/mailparse/fn.parse_header.html | 2 +- target/doc/mailparse/fn.parse_headers.html | 2 +- target/doc/mailparse/fn.parse_mail.html | 2 +- target/doc/mailparse/index.html | 2 +- target/doc/mailparse/struct.MailHeader.html | 2 +- target/doc/mailparse/struct.ParsedContentType.html | 2 +- target/doc/mailparse/struct.ParsedMail.html | 2 +- target/doc/mailparse/trait.MailHeaderMap.html | 2 +- target/doc/src/mailparse/src/lib.rs.html | 82 +++++++++++++++++++--- 17 files changed, 87 insertions(+), 27 deletions(-) diff --git a/target/doc/implementors/core/convert/trait.From.js b/target/doc/implementors/core/convert/trait.From.js index 00678ce..04e4c31 100644 --- a/target/doc/implementors/core/convert/trait.From.js +++ b/target/doc/implementors/core/convert/trait.From.js @@ -1,5 +1,5 @@ (function() {var implementors = {}; -implementors['mailparse'] = ["impl From<QuotedPrintableError> for MailParseError","impl From<Base64Error> for MailParseError","impl From<Cow<'static, str>> for MailParseError",];implementors['mailparse'] = ["impl From<QuotedPrintableError> for MailParseError","impl From<Base64Error> for MailParseError","impl From<Cow<'static, str>> for MailParseError",];implementors['mailparse'] = ["impl From<QuotedPrintableError> for MailParseError","impl From<Base64Error> for MailParseError","impl From<Cow<'static, str>> for MailParseError",]; +implementors['mailparse'] = ["impl From<QuotedPrintableError> for MailParseError","impl From<Base64Error> for MailParseError","impl From<Cow<'static, str>> for MailParseError",];implementors['mailparse'] = ["impl From<QuotedPrintableError> for MailParseError","impl From<Base64Error> for MailParseError","impl From<Cow<'static, str>> for MailParseError",];implementors['mailparse'] = ["impl From<QuotedPrintableError> for MailParseError","impl From<Base64Error> for MailParseError","impl From<Cow<'static, str>> for MailParseError",];implementors['mailparse'] = ["impl From<QuotedPrintableError> for MailParseError","impl From<Base64Error> for MailParseError","impl From<Cow<'static, str>> for MailParseError",]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/target/doc/implementors/core/fmt/trait.Debug.js b/target/doc/implementors/core/fmt/trait.Debug.js index 2f270d1..8dd6c50 100644 --- a/target/doc/implementors/core/fmt/trait.Debug.js +++ b/target/doc/implementors/core/fmt/trait.Debug.js @@ -1,5 +1,5 @@ (function() {var implementors = {}; -implementors['mailparse'] = ["impl Debug for MailParseError","impl<'a> Debug for MailHeader<'a>","impl Debug for ParsedContentType","impl<'a> Debug for ParsedMail<'a>",];implementors['mailparse'] = ["impl Debug for MailParseError","impl<'a> Debug for MailHeader<'a>","impl Debug for ParsedContentType","impl<'a> Debug for ParsedMail<'a>",];implementors['mailparse'] = ["impl Debug for MailParseError","impl<'a> Debug for MailHeader<'a>","impl Debug for ParsedContentType","impl<'a> Debug for ParsedMail<'a>",]; +implementors['mailparse'] = ["impl Debug for MailParseError","impl<'a> Debug for MailHeader<'a>","impl Debug for ParsedContentType","impl<'a> Debug for ParsedMail<'a>",];implementors['mailparse'] = ["impl Debug for MailParseError","impl<'a> Debug for MailHeader<'a>","impl Debug for ParsedContentType","impl<'a> Debug for ParsedMail<'a>",];implementors['mailparse'] = ["impl Debug for MailParseError","impl<'a> Debug for MailHeader<'a>","impl Debug for ParsedContentType","impl<'a> Debug for ParsedMail<'a>",];implementors['mailparse'] = ["impl Debug for MailParseError","impl<'a> Debug for MailHeader<'a>","impl Debug for ParsedContentType","impl<'a> Debug for ParsedMail<'a>",]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/target/doc/implementors/core/fmt/trait.Display.js b/target/doc/implementors/core/fmt/trait.Display.js index ff2d722..05113b9 100644 --- a/target/doc/implementors/core/fmt/trait.Display.js +++ b/target/doc/implementors/core/fmt/trait.Display.js @@ -1,5 +1,5 @@ (function() {var implementors = {}; -implementors['mailparse'] = ["impl Display for MailParseError",];implementors['mailparse'] = ["impl Display for MailParseError",];implementors['mailparse'] = ["impl Display for MailParseError",]; +implementors['mailparse'] = ["impl Display for MailParseError",];implementors['mailparse'] = ["impl Display for MailParseError",];implementors['mailparse'] = ["impl Display for MailParseError",];implementors['mailparse'] = ["impl Display for MailParseError",]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/target/doc/implementors/mailparse/trait.MailHeaderMap.js b/target/doc/implementors/mailparse/trait.MailHeaderMap.js index 7868a61..fc96797 100644 --- a/target/doc/implementors/mailparse/trait.MailHeaderMap.js +++ b/target/doc/implementors/mailparse/trait.MailHeaderMap.js @@ -1,5 +1,5 @@ (function() {var implementors = {}; -implementors['mailparse'] = [];implementors['mailparse'] = [];implementors['mailparse'] = []; +implementors['mailparse'] = [];implementors['mailparse'] = [];implementors['mailparse'] = [];implementors['mailparse'] = []; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/target/doc/implementors/std/error/trait.Error.js b/target/doc/implementors/std/error/trait.Error.js index 6563070..2e22de4 100644 --- a/target/doc/implementors/std/error/trait.Error.js +++ b/target/doc/implementors/std/error/trait.Error.js @@ -1,5 +1,5 @@ (function() {var implementors = {}; -implementors['mailparse'] = ["impl Error for MailParseError",];implementors['mailparse'] = ["impl Error for MailParseError",];implementors['mailparse'] = ["impl Error for MailParseError",]; +implementors['mailparse'] = ["impl Error for MailParseError",];implementors['mailparse'] = ["impl Error for MailParseError",];implementors['mailparse'] = ["impl Error for MailParseError",];implementors['mailparse'] = ["impl Error for MailParseError",]; if (window.register_implementors) { window.register_implementors(implementors); diff --git a/target/doc/mailparse/enum.MailParseError.html b/target/doc/mailparse/enum.MailParseError.html index a7e3eb0..9b438b4 100644 --- a/target/doc/mailparse/enum.MailParseError.html +++ b/target/doc/mailparse/enum.MailParseError.html @@ -47,7 +47,7 @@ [] - [src] + [src]
pub enum MailParseError {
     QuotedPrintableDecodeError(QuotedPrintableError),
     Base64DecodeError(Base64Error),
diff --git a/target/doc/mailparse/fn.dateparse.html b/target/doc/mailparse/fn.dateparse.html
index 0a6a0fd..1e9b15e 100644
--- a/target/doc/mailparse/fn.dateparse.html
+++ b/target/doc/mailparse/fn.dateparse.html
@@ -47,7 +47,7 @@
                    
                        []
                    
-               [src]
+               [src]
 
pub fn dateparse(date: &str) -> Result<i64, &'static str>

Convert a date field from an email header into a UNIX epoch timestamp. This function handles the most common formatting of date fields found in email headers. It may fail to parse some of the more creative formattings.

diff --git a/target/doc/mailparse/fn.parse_content_type.html b/target/doc/mailparse/fn.parse_content_type.html index 08ef924..a437727 100644 --- a/target/doc/mailparse/fn.parse_content_type.html +++ b/target/doc/mailparse/fn.parse_content_type.html @@ -47,7 +47,7 @@ [] - [src] + [src]
pub fn parse_content_type(header: &str) -> Result<ParsedContentType, MailParseError>

Helper method to parse a header value as a Content-Type header. The charset defaults to "us-ascii" if no charset parameter is provided in the header value.

diff --git a/target/doc/mailparse/fn.parse_header.html b/target/doc/mailparse/fn.parse_header.html index 8dbe04d..58b4e87 100644 --- a/target/doc/mailparse/fn.parse_header.html +++ b/target/doc/mailparse/fn.parse_header.html @@ -47,7 +47,7 @@ [] - [src] + [src]
pub fn parse_header(raw_data: &[u8]) -> Result<(MailHeader, usize), MailParseError>

Parse a single header from the raw data given. This function takes raw byte data, and starts parsing it, expecting there to be a MIME header key-value pair right at the beginning. It parses that diff --git a/target/doc/mailparse/fn.parse_headers.html b/target/doc/mailparse/fn.parse_headers.html index c5e42be..984bce7 100644 --- a/target/doc/mailparse/fn.parse_headers.html +++ b/target/doc/mailparse/fn.parse_headers.html @@ -47,7 +47,7 @@ [] - [src] + [src]

pub fn parse_headers(raw_data: &[u8]) -> Result<(Vec<MailHeader>, usize), MailParseError>

Parses all the headers from the raw data given. This function takes raw byte data, and starts parsing it, expecting there to be zero or more MIME header key-value pair right at the beginning, diff --git a/target/doc/mailparse/fn.parse_mail.html b/target/doc/mailparse/fn.parse_mail.html index 95d75aa..d8d61bb 100644 --- a/target/doc/mailparse/fn.parse_mail.html +++ b/target/doc/mailparse/fn.parse_mail.html @@ -47,7 +47,7 @@ [] - [src] + [src]

pub fn parse_mail(raw_data: &[u8]) -> Result<ParsedMail, MailParseError>

The main mail-parsing entry point. This function takes the raw data making up the message body and returns a structured version of it, which allows easily accessing the header and body diff --git a/target/doc/mailparse/index.html b/target/doc/mailparse/index.html index 83af7c0..54f0934 100644 --- a/target/doc/mailparse/index.html +++ b/target/doc/mailparse/index.html @@ -47,7 +47,7 @@ [] - [src] + [src]

Structs

diff --git a/target/doc/mailparse/struct.MailHeader.html b/target/doc/mailparse/struct.MailHeader.html index 0160a89..a6c44c7 100644 --- a/target/doc/mailparse/struct.MailHeader.html +++ b/target/doc/mailparse/struct.MailHeader.html @@ -47,7 +47,7 @@ [] - [src] + [src]
pub struct MailHeader<'a> {
     // some fields omitted
 }

A struct that represents a single header in the message. diff --git a/target/doc/mailparse/struct.ParsedContentType.html b/target/doc/mailparse/struct.ParsedContentType.html index 8d4d189..38b2bad 100644 --- a/target/doc/mailparse/struct.ParsedContentType.html +++ b/target/doc/mailparse/struct.ParsedContentType.html @@ -47,7 +47,7 @@ [] - [src] + [src]

pub struct ParsedContentType {
     pub mimetype: String,
     pub charset: String,
diff --git a/target/doc/mailparse/struct.ParsedMail.html b/target/doc/mailparse/struct.ParsedMail.html
index 5446417..cc1acaa 100644
--- a/target/doc/mailparse/struct.ParsedMail.html
+++ b/target/doc/mailparse/struct.ParsedMail.html
@@ -47,7 +47,7 @@
                    
                        []
                    
-               [src]
+               [src]
 
pub struct ParsedMail<'a> {
     pub headers: Vec<MailHeader<'a>>,
     pub ctype: ParsedContentType,
diff --git a/target/doc/mailparse/trait.MailHeaderMap.html b/target/doc/mailparse/trait.MailHeaderMap.html
index 245b416..11f83e1 100644
--- a/target/doc/mailparse/trait.MailHeaderMap.html
+++ b/target/doc/mailparse/trait.MailHeaderMap.html
@@ -47,7 +47,7 @@
                    
                        []
                    
-               [src]
+               [src]
 
pub trait MailHeaderMap {
     fn get_first_value(&self, key: &str) -> Result<Option<String>, MailParseError>;
     fn get_all_values(&self, key: &str) -> Result<Vec<String>, MailParseError>;
diff --git a/target/doc/src/mailparse/src/lib.rs.html b/target/doc/src/mailparse/src/lib.rs.html
index 313765d..104a734 100644
--- a/target/doc/src/mailparse/src/lib.rs.html
+++ b/target/doc/src/mailparse/src/lib.rs.html
@@ -991,11 +991,42 @@
 947
 948
 949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
 
 extern crate base64;
 extern crate encoding;
 extern crate quoted_printable;
 
+use std::ascii::AsciiExt;
 use std::error;
 use std::fmt;
 use std::ops::Deref;
@@ -1249,6 +1280,7 @@
     }
 }
 
+#[derive(Debug)]
 enum HeaderParseState {
     Initial,
     Key,
@@ -1393,9 +1425,8 @@
 
 impl<'a> MailHeaderMap for Vec<MailHeader<'a>> {
     fn get_first_value(&self, key: &str) -> Result<Option<String>, MailParseError> {
-        let lower_key = key.to_lowercase();
         for x in self {
-            if try!(x.get_key()).to_lowercase() == lower_key {
+            if try!(x.get_key()).eq_ignore_ascii_case(key) {
                 return x.get_value().map(|v| Some(v));
             }
         }
@@ -1403,10 +1434,9 @@
     }
 
     fn get_all_values(&self, key: &str) -> Result<Vec<String>, MailParseError> {
-        let lower_key = key.to_lowercase();
         let mut values: Vec<String> = Vec::new();
         for x in self {
-            if try!(x.get_key()).to_lowercase() == lower_key {
+            if try!(x.get_key()).eq_ignore_ascii_case(key) {
                 values.push(try!(x.get_value()));
             }
         }
@@ -1441,12 +1471,7 @@
     let mut headers: Vec<MailHeader> = 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' {
@@ -1458,6 +1483,12 @@
                                                     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))
 }
@@ -1643,7 +1674,9 @@
         body: &raw_data[ix_body..],
         subparts: Vec::<ParsedMail>::new(),
     };
-    if result.ctype.mimetype.starts_with("multipart/") && result.ctype.boundary.is_some() {
+    if result.ctype.mimetype.starts_with("multipart/")
+            && result.ctype.boundary.is_some()
+            && raw_data.len() > ix_body {
         let boundary = String::from("--") + result.ctype.boundary.as_ref().unwrap();
         if let Some(ix_body_end) = find_from_u8(raw_data, ix_body, boundary.as_bytes()) {
             result.body = &raw_data[ix_body..ix_body_end];
@@ -1940,6 +1973,33 @@
         assert_eq!(mail.ctype.mimetype, "text/html");
         assert_eq!(mail.get_body().unwrap(), "hello world");
     }
+
+    #[test]
+    fn test_missing_body() {
+        let parsed = parse_mail(
+                "Content-Type: multipart/related; boundary=\"----=_\"\n"
+                .as_bytes())
+            .unwrap();
+        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