keep reference to original raw bytes
This commit is contained in:
+19
-9
@@ -188,12 +188,8 @@ pub trait Mail<'a, T: Header<'a> + 'a>: HeaderMap<'a, T> {
|
|||||||
fn get_content_encoded<'b>(&'b self, ctype: &'b ContentType, transfer_encoding: &Option<String>) -> Body<'b> {
|
fn get_content_encoded<'b>(&'b self, ctype: &'b ContentType, transfer_encoding: &Option<String>) -> Body<'b> {
|
||||||
Body::new(self.raw_body(), ctype, transfer_encoding)
|
Body::new(self.raw_body(), ctype, transfer_encoding)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub fn generate_boundary() -> String {
|
pub fn generate_boundary() -> String {
|
||||||
rng()
|
rng()
|
||||||
.sample_iter(&Alphanumeric)
|
.sample_iter(&Alphanumeric)
|
||||||
@@ -204,6 +200,8 @@ pub fn generate_boundary() -> String {
|
|||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct CowMail<'a, H: Header<'a>> {
|
pub struct CowMail<'a, H: Header<'a>> {
|
||||||
|
pub bytes_orig: &'a [u8],
|
||||||
|
pub header_bytes_orig: &'a [u8],
|
||||||
pub headers: Vec<H>,
|
pub headers: Vec<H>,
|
||||||
pub body_bytes: Cow<'a, [u8]>,
|
pub body_bytes: Cow<'a, [u8]>,
|
||||||
pub subparts: Vec<CowMail<'a, H>>,
|
pub subparts: Vec<CowMail<'a, H>>,
|
||||||
@@ -220,6 +218,8 @@ impl<'a> Default for CowMail<'a, CowHeader<'a>> {
|
|||||||
impl<'a, H: Header<'a> + 'a> CowMail<'a, H> {
|
impl<'a, H: Header<'a> + 'a> CowMail<'a, H> {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
bytes_orig: &[],
|
||||||
|
header_bytes_orig: &[],
|
||||||
headers: Vec::new(),
|
headers: Vec::new(),
|
||||||
body_bytes: Cow::Borrowed(&[]),
|
body_bytes: Cow::Borrowed(&[]),
|
||||||
subparts: Vec::new(),
|
subparts: Vec::new(),
|
||||||
@@ -680,7 +680,6 @@ impl<'a, H: Header<'a> + 'a> Mail<'a, H> for CowMail<'a, H> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl<'a> TryFrom<&'a [u8]> for CowMail<'a, CowHeader<'a>> {
|
impl<'a> TryFrom<&'a [u8]> for CowMail<'a, CowHeader<'a>> {
|
||||||
type Error = &'static str;
|
type Error = &'static str;
|
||||||
|
|
||||||
@@ -761,6 +760,8 @@ fn parse_mail_recursive<'a, H: Header<'a> + 'a>(
|
|||||||
.unwrap_or(default_ctype.clone());
|
.unwrap_or(default_ctype.clone());
|
||||||
|
|
||||||
let mut mail = CowMail {
|
let mut mail = CowMail {
|
||||||
|
bytes_orig: raw_data,
|
||||||
|
header_bytes_orig: &raw_data[0..body_idx],
|
||||||
headers,
|
headers,
|
||||||
body_bytes: Cow::Borrowed(&raw_data[body_idx..]),
|
body_bytes: Cow::Borrowed(&raw_data[body_idx..]),
|
||||||
subparts: Vec::new(),
|
subparts: Vec::new(),
|
||||||
@@ -840,7 +841,7 @@ fn find_from_u8(line: &[u8], ix_start: usize, key: &[u8]) -> Option<usize> {
|
|||||||
mod tests {
|
mod tests {
|
||||||
//use std::io::{Read, Write};
|
//use std::io::{Read, Write};
|
||||||
|
|
||||||
use crate::{CowHeader, CowMail, Mail, Header, HeaderMap};
|
use crate::{CowHeader, CowMail, Header, HeaderMap, Mail};
|
||||||
use mediatype::{names::*, MediaType};
|
use mediatype::{names::*, MediaType};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -867,7 +868,10 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mail.insert_header("X-Test", "Test1", 1);
|
mail.insert_header("X-Test", "Test1", 1);
|
||||||
assert_eq!(mail.iter_values("X-Test").collect::<Vec<_>>(), ["Test", "Test1", "Test2", "Test3"]);
|
assert_eq!(
|
||||||
|
mail.iter_values("X-Test").collect::<Vec<_>>(),
|
||||||
|
["Test", "Test1", "Test2", "Test3"]
|
||||||
|
);
|
||||||
|
|
||||||
mail.replace_all_headers("X-Test", "Test555");
|
mail.replace_all_headers("X-Test", "Test555");
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@@ -879,10 +883,16 @@ mod tests {
|
|||||||
mail.replace_header("X-Test", "Test1", 1);
|
mail.replace_header("X-Test", "Test1", 1);
|
||||||
mail.replace_header("X-Test", "Test2", 2);
|
mail.replace_header("X-Test", "Test2", 2);
|
||||||
mail.replace_header("X-Test", "Test3", 3);
|
mail.replace_header("X-Test", "Test3", 3);
|
||||||
assert_eq!(mail.iter_values("X-Test").collect::<Vec<_>>(), ["Test", "Test1", "Test2", "Test3"]);
|
assert_eq!(
|
||||||
|
mail.iter_values("X-Test").collect::<Vec<_>>(),
|
||||||
|
["Test", "Test1", "Test2", "Test3"]
|
||||||
|
);
|
||||||
|
|
||||||
mail.remove_header("X-Test", 1);
|
mail.remove_header("X-Test", 1);
|
||||||
assert_eq!(mail.iter_values("X-Test").collect::<Vec<_>>(), ["Test", "Test2", "Test3"]);
|
assert_eq!(
|
||||||
|
mail.iter_values("X-Test").collect::<Vec<_>>(),
|
||||||
|
["Test", "Test2", "Test3"]
|
||||||
|
);
|
||||||
mail.remove_all_headers("X-Test");
|
mail.remove_all_headers("X-Test");
|
||||||
assert_eq!(mail.headers.len(), 2);
|
assert_eq!(mail.headers.len(), 2);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user