diff options
| -rw-r--r-- | src/meta.rs | 14 | ||||
| -rw-r--r-- | tests/meta.rs | 12 |
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); + } } |