diff options
author | Kartikaya Gupta <kgupta@mozilla.com> | 2016-06-12 20:18:07 -0400 |
---|---|---|
committer | Kartikaya Gupta <kgupta@mozilla.com> | 2016-06-12 20:18:07 -0400 |
commit | cd8c86fcaf87b71c9dff720074e380394d9b5d40 (patch) | |
tree | ba46a4564ff8f2ac44a1ef0cb22fa03e375da9fb | |
parent | f3e94f3aca7cd6d3407bc9f6ba82707c7a7c0784 (diff) |
Handle content-transfer-encoding in mail bodies
-rw-r--r-- | src/lib.rs | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -412,8 +412,20 @@ pub struct ParsedMail<'a> { impl<'a> ParsedMail<'a> { pub fn get_body(&self) -> Result<String, MailParseError> { - Ok(try!(encoding::all::ISO_8859_1.decode(self.body, encoding::DecoderTrap::Strict)) - .to_string()) + let transfer_coding = try!(self.headers.get_first_value("Content-Transfer-Encoding")) + .map(|s| s.to_lowercase()); + let decoded = match transfer_coding.unwrap_or(String::new()).as_ref() { + "base64" => try!(base64::u8de(self.body)), + "quoted-printable" => try!(quoted_printable::decode(self.body, quoted_printable::ParseMode::Robust)), + _ => Vec::<u8>::from(self.body), + }; + let charset_conv = try!(encoding::label::encoding_from_whatwg_label(&self.ctype.charset) + .ok_or(MailParseError::Generic("Unknown charset found".to_string(), + 0))); + let str_body = try!(charset_conv.decode(&decoded, encoding::DecoderTrap::Replace).map_err(|_| { + MailParseError::Generic("Unable to convert transfer-decoded bytes from specified charset".to_string(), 0) + })); + Ok(str_body) } } |