Skip to content

Commit 9cd1d43

Browse files
committed
Decode header using rfc2047-decoder instead
1 parent e74d028 commit 9cd1d43

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ bzip2 = { version = "0.4.2", optional = true }
1616
flate2 = "1.0.20"
1717
fs-err = "2.6.0"
1818
mailparse = "0.13.4"
19+
rfc2047-decoder = "0.1.2"
1920
serde = { version = "1.0.126", features = ["derive"], optional = true }
2021
tar = "0.4.35"
2122
xz = { version = "0.1.0", optional = true }

src/metadata.rs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,23 @@ pub struct Metadata {
7878
impl Metadata {
7979
/// Parse distribution metadata from metadata bytes
8080
pub fn parse(content: &[u8]) -> Result<Self, Error> {
81-
let msg = mailparse::parse_mail(content)?;
81+
// HACK: trick mailparse to parse as UTF-8 instead of ASCII
82+
let mut mail = b"Content-Type: text/plain; charset=utf-8\n".to_vec();
83+
mail.extend_from_slice(content);
84+
85+
let msg = mailparse::parse_mail(&mail)?;
8286
let headers = msg.get_headers();
8387
let get_first_value = |name| {
84-
headers.get_first_value(name).and_then(|value| {
85-
if value == "UNKNOWN" {
86-
None
87-
} else {
88-
Some(value)
88+
headers.get_first_header(name).and_then(|header| {
89+
match rfc2047_decoder::decode(header.get_value_raw()) {
90+
Ok(value) => {
91+
if value == "UNKNOWN" {
92+
None
93+
} else {
94+
Some(value)
95+
}
96+
}
97+
Err(_) => None,
8998
}
9099
})
91100
};
@@ -199,5 +208,10 @@ mod tests {
199208
let s = "Metadata-Version: 1.0\nName: asdf\nVersion: 1.0\n\na Python package";
200209
let meta: Metadata = s.parse().unwrap();
201210
assert_eq!(meta.description.as_deref(), Some("a Python package"));
211+
212+
let s = "Metadata-Version: 1.0\nName: asdf\nVersion: 1.0\nAuthor: 中文\n\n一个 Python 包";
213+
let meta: Metadata = s.parse().unwrap();
214+
assert_eq!(meta.author.as_deref(), Some("中文"));
215+
assert_eq!(meta.description.as_deref(), Some("一个 Python 包"));
202216
}
203217
}

0 commit comments

Comments
 (0)