aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/meta.rs14
-rw-r--r--tests/meta.rs12
2 files changed, 20 insertions, 6 deletions
diff --git a/src/meta.rs b/src/meta.rs
index d50af2d..453bbb6 100644
--- a/src/meta.rs
+++ b/src/meta.rs
@@ -78,13 +78,15 @@ impl Meta {
let mut parameters = HashMap::new();
for parameter in metas {
- let key_value =
- parameter.trim_start().split_at(parameter.find('=').unwrap_or(0));
+ let trimmed = parameter.trim_start();
- parameters.insert(
- key_value.0.to_string().replace('=', ""),
- key_value.1.to_string(),
- );
+ // Only parse parameters containing '=' as those without are malformed
+ // according to RFC 2045
+ if let Some(equal_pos) = trimmed.find('=') {
+ let (key, value) = trimmed.split_at(equal_pos);
+
+ parameters.insert(key.to_string(), value[1..].to_string());
+ }
}
Self { mime, parameters }
diff --git a/tests/meta.rs b/tests/meta.rs
index e92df0e..368cd68 100644
--- a/tests/meta.rs
+++ b/tests/meta.rs
@@ -90,4 +90,16 @@ mod test {
2,
);
}
+
+ #[test]
+ fn meta_handles_malformed_parameters() {
+ let meta =
+ Meta::from_string("text/gemini; valid=value; malformed; another=test");
+
+ assert_eq!(meta.mime(), "text/gemini");
+ assert_eq!(meta.parameters().len(), 2);
+ assert_eq!(meta.parameters().get("valid"), Some(&"value".to_string()));
+ assert_eq!(meta.parameters().get("another"), Some(&"test".to_string()));
+ assert_eq!(meta.parameters().get("malformed"), None);
+ }
}