summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorKartikaya Gupta <kgupta@mozilla.com>2016-06-12 20:18:07 -0400
committerKartikaya Gupta <kgupta@mozilla.com>2016-06-12 20:18:07 -0400
commitcd8c86fcaf87b71c9dff720074e380394d9b5d40 (patch)
treeba46a4564ff8f2ac44a1ef0cb22fa03e375da9fb /src/lib.rs
parentf3e94f3aca7cd6d3407bc9f6ba82707c7a7c0784 (diff)
Handle content-transfer-encoding in mail bodies
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 1617748..d0ba1de 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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)
}
}