diff options
Diffstat (limited to 'core/src/encode.rs')
-rw-r--r-- | core/src/encode.rs | 128 |
1 files changed, 58 insertions, 70 deletions
diff --git a/core/src/encode.rs b/core/src/encode.rs index 1ea34c0..1a1c5c5 100644 --- a/core/src/encode.rs +++ b/core/src/encode.rs @@ -1,33 +1,20 @@ -use soft_ascii_string::{ - SoftAsciiStr, - SoftAsciiChar, - SoftAsciiString -}; use media_type::BOUNDARY; +use soft_ascii_string::{SoftAsciiChar, SoftAsciiStr, SoftAsciiString}; -use internals::{ - encoder::{ - EncodingBuffer, EncodingWriter, - }, - error::{EncodingError, EncodingErrorKind, Place, UTF_8, US_ASCII} -}; use headers::{ - HeaderName, - HeaderObj, HeaderObjTrait, - HeaderKind, - headers::{ContentTransferEncoding, ContentType} + headers::{ContentTransferEncoding, ContentType}, + HeaderKind, HeaderName, HeaderObj, HeaderObjTrait, +}; +use internals::{ + encoder::{EncodingBuffer, EncodingWriter}, + error::{EncodingError, EncodingErrorKind, Place, US_ASCII, UTF_8}, }; -use ::{ +use { error::MailError, - mail::{ - Mail, - EncodableMail, - assume_encoded - } + mail::{assume_encoded, EncodableMail, Mail}, }; - /// /// # Panics /// if the body is not yet resolved use `Body::poll_body` or `IntoFuture` @@ -37,25 +24,20 @@ use ::{ pub(crate) fn encode_mail( mail: &EncodableMail, top: bool, - encoder: &mut EncodingBuffer + encoder: &mut EncodingBuffer, ) -> Result<(), MailError> { - _encode_mail(&*mail, top, encoder) - .map_err(|err| { - let mail_type = encoder.mail_type(); - use self::MailError::*; - - match err { - Encoding(enc_err) => Encoding(enc_err.with_mail_type_or_else(||Some(mail_type))), - other => other - } - }) + _encode_mail(&*mail, top, encoder).map_err(|err| { + let mail_type = encoder.mail_type(); + use self::MailError::*; + + match err { + Encoding(enc_err) => Encoding(enc_err.with_mail_type_or_else(|| Some(mail_type))), + other => other, + } + }) } -fn _encode_mail( - mail: &Mail, - top: bool, - encoder: &mut EncodingBuffer -) -> Result<(), MailError> { +fn _encode_mail(mail: &Mail, top: bool, encoder: &mut EncodingBuffer) -> Result<(), MailError> { encode_headers(&mail, top, encoder)?; //the empty line between the headers and the body @@ -71,35 +53,30 @@ fn _encode_mail( /// if the body is not yet resolved use `Body::poll_body` or `IntoFuture` /// on `Mail` to prevent this from happening /// -fn encode_headers( - mail: &Mail, - top: bool, - encoder: &mut EncodingBuffer -) -> Result<(), MailError> { +fn encode_headers(mail: &Mail, top: bool, encoder: &mut EncodingBuffer) -> Result<(), MailError> { use super::MailBody::*; let mut handle = encoder.writer(); if top { - handle.write_str(SoftAsciiStr::from_unchecked( - "MIME-Version: 1.0" - ))?; + handle.write_str(SoftAsciiStr::from_unchecked("MIME-Version: 1.0"))?; handle.finish_header(); } for (name, hbody) in mail.headers().iter() { let name_as_str = name.as_str(); - let ignored_header = !top && - !(name_as_str.starts_with("Content-") - || name_as_str.starts_with("X-") ); + let ignored_header = + !top && !(name_as_str.starts_with("Content-") || name_as_str.starts_with("X-")); if ignored_header { - warn!("non `Content-` header in MIME body: {:?}: {:?}", name, hbody); + warn!( + "non `Content-` header in MIME body: {:?}: {:?}", + name, hbody + ); } encode_header(&mut handle, name, hbody)?; } - match mail.body() { SingleBody { ref body } => { let data = assume_encoded(body); @@ -107,8 +84,11 @@ fn encode_headers( encode_header(&mut handle, header.name(), &header)?; let header = ContentType::body(data.media_type().clone()); encode_header(&mut handle, header.name(), &header)?; - }, - MultipleBodies { hidden_text:_, bodies:_ } => {} + } + MultipleBodies { + hidden_text: _, + bodies: _, + } => {} } Ok(()) } @@ -116,7 +96,7 @@ fn encode_headers( fn encode_header( handle: &mut EncodingWriter, name: HeaderName, - header: &HeaderObj + header: &HeaderObj, ) -> Result<(), EncodingError> { //FIXME[rust/catch] use catch block let res = (|| -> Result<(), EncodingError> { @@ -129,7 +109,11 @@ fn encode_header( })(); res.map_err(|err| { - err.with_place_or_else(|| Some(Place::Header { name: name.as_str() })) + err.with_place_or_else(|| { + Some(Place::Header { + name: name.as_str(), + }) + }) }) } @@ -138,9 +122,7 @@ fn encode_header( /// if the body is not yet resolved use `Body::poll_body` or `IntoFuture` /// on `Mail` to prevent this from happening /// -fn encode_mail_part(mail: &Mail, encoder: &mut EncodingBuffer ) - -> Result<(), MailError> -{ +fn encode_mail_part(mail: &Mail, encoder: &mut EncodingBuffer) -> Result<(), MailError> { use super::MailBody::*; let minus = SoftAsciiChar::from_unchecked('-'); @@ -150,8 +132,11 @@ fn encode_mail_part(mail: &Mail, encoder: &mut EncodingBuffer ) let data = assume_encoded(body); let buffer = data.transfer_encoded_buffer(); encoder.write_body_unchecked(buffer); - }, - MultipleBodies { ref hidden_text, ref bodies } => { + } + MultipleBodies { + ref hidden_text, + ref bodies, + } => { if hidden_text.len() > 0 { //TODO find out if there is any source using the hidden text // (e.g. for some form of validation, prove of senders validity etc.) @@ -160,7 +145,8 @@ fn encode_mail_part(mail: &Mail, encoder: &mut EncodingBuffer ) } let mail_was_validated_err_msg = "[BUG] mail was already validated"; - let boundary = mail.headers() + let boundary = mail + .headers() .get_single(ContentType) .expect(mail_was_validated_err_msg) .expect(mail_was_validated_err_msg) @@ -168,16 +154,18 @@ fn encode_mail_part(mail: &Mail, encoder: &mut EncodingBuffer ) .expect(mail_was_validated_err_msg) .to_content(); - let boundary = SoftAsciiString - ::from_string(boundary) - .map_err(|orig_string| EncodingError - ::from(EncodingErrorKind::InvalidTextEncoding { - got_encoding: UTF_8, - expected_encoding: US_ASCII + let boundary = SoftAsciiString::from_string(boundary).map_err(|orig_string| { + EncodingError::from(EncodingErrorKind::InvalidTextEncoding { + got_encoding: UTF_8, + expected_encoding: US_ASCII, + }) + .with_place_or_else(|| { + Some(Place::Header { + name: "Content-Type", }) - .with_place_or_else(|| Some(Place::Header { name: "Content-Type" })) - .with_str_context(orig_string.into_source()) - )?; + }) + .with_str_context(orig_string.into_source()) + })?; for mail in bodies.iter() { encoder.write_header_line(|handle| { |