Skip to content

Commit 2805e02

Browse files
committed
v0.4.7
1 parent 35b4846 commit 2805e02

File tree

5 files changed

+66
-4
lines changed

5 files changed

+66
-4
lines changed

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
mail-parser 0.4.7
2+
================================
3+
- Retrieving message headers in order (#19)
4+
- Added `get_raw_headers` and `get_header` methods.
5+
- Support for malformed Return-Path fields.
6+
- Support for ks_c_5601 charsets (#20)
7+
18
mail-parser 0.4.6
29
================================
310
- DateTime is_valid() fix (#15)

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "mail-parser"
33
description = "Fast and robust e-mail parsing library for Rust"
4-
version = "0.4.6"
4+
version = "0.4.7"
55
edition = "2018"
66
authors = [ "Stalwart Labs <hello@stalw.art>"]
77
license = "Apache-2.0 OR MIT"

src/lib.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -1048,8 +1048,13 @@ impl<'x> Message<'x> {
10481048
}
10491049

10501050
/// Returns all headers in raw format
1051-
pub fn get_raw_headers(&self) -> &[(HeaderName, HeaderOffset)] {
1052-
&self.headers_raw
1051+
pub fn get_raw_headers(&self) -> impl Iterator<Item = (&HeaderName, Cow<str>)> {
1052+
self.headers_raw.iter().map(move |(name, offset)| {
1053+
(
1054+
name,
1055+
String::from_utf8_lossy(&self.raw_message[offset.start..offset.end]),
1056+
)
1057+
})
10531058
}
10541059

10551060
pub fn _get_raw(&'x self, name: HeaderName) -> Option<Vec<Cow<'x, str>>> {

src/parsers/fields/raw.rs

+50
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ pub fn parse_and_ignore(stream: &mut MessageStream) {
7373
mod tests {
7474
use crate::parsers::fields::raw::parse_raw;
7575
use crate::parsers::message::MessageStream;
76+
use crate::{HeaderName, Message, RfcHeader};
7677

7778
#[test]
7879
fn parse_raw_text() {
@@ -103,4 +104,53 @@ mod tests {
103104
);
104105
}
105106
}
107+
108+
#[test]
109+
fn ordered_raw_headers() {
110+
let input = br#"From: Art Vandelay <art@vandelay.com>
111+
To: jane@example.com
112+
Date: Sat, 20 Nov 2021 14:22:01 -0800
113+
Subject: Why not both importing AND exporting? =?utf-8?b?4pi6?=
114+
Content-Type: multipart/mixed; boundary="festivus";
115+
116+
Here's a message body.
117+
"#;
118+
let message = Message::parse(input).unwrap();
119+
let mut iter = message.get_raw_headers();
120+
assert_eq!(
121+
iter.next().unwrap(),
122+
(
123+
&HeaderName::Rfc(RfcHeader::From),
124+
" Art Vandelay <art@vandelay.com>\n".into()
125+
)
126+
);
127+
assert_eq!(
128+
iter.next().unwrap(),
129+
(
130+
&HeaderName::Rfc(RfcHeader::To),
131+
" jane@example.com\n".into()
132+
)
133+
);
134+
assert_eq!(
135+
iter.next().unwrap(),
136+
(
137+
&HeaderName::Rfc(RfcHeader::Date),
138+
" Sat, 20 Nov 2021 14:22:01 -0800\n".into()
139+
)
140+
);
141+
assert_eq!(
142+
iter.next().unwrap(),
143+
(
144+
&HeaderName::Rfc(RfcHeader::Subject),
145+
" Why not both importing AND exporting? =?utf-8?b?4pi6?=\n".into()
146+
)
147+
);
148+
assert_eq!(
149+
iter.next().unwrap(),
150+
(
151+
&HeaderName::Rfc(RfcHeader::ContentType),
152+
" multipart/mixed; boundary=\"festivus\";\n".into()
153+
)
154+
);
155+
}
106156
}

0 commit comments

Comments
 (0)