🦠 The Definitive Gemini Protocol Toolkit
gemini gemini-protocol gemtext parser zero-dependency toolkit ast converter html markdown cli networking

fix(meta): Better comply with RFC 2045

fuwn.net f80e2cd0 51e79294

verified
+20 -6
+8 -6
src/meta.rs
··· 78 78 let mut parameters = HashMap::new(); 79 79 80 80 for parameter in metas { 81 - let key_value = 82 - parameter.trim_start().split_at(parameter.find('=').unwrap_or(0)); 81 + let trimmed = parameter.trim_start(); 83 82 84 - parameters.insert( 85 - key_value.0.to_string().replace('=', ""), 86 - key_value.1.to_string(), 87 - ); 83 + // Only parse parameters containing '=' as those without are malformed 84 + // according to RFC 2045 85 + if let Some(equal_pos) = trimmed.find('=') { 86 + let (key, value) = trimmed.split_at(equal_pos); 87 + 88 + parameters.insert(key.to_string(), value[1..].to_string()); 89 + } 88 90 } 89 91 90 92 Self { mime, parameters }
+12
tests/meta.rs
··· 90 90 2, 91 91 ); 92 92 } 93 + 94 + #[test] 95 + fn meta_handles_malformed_parameters() { 96 + let meta = 97 + Meta::from_string("text/gemini; valid=value; malformed; another=test"); 98 + 99 + assert_eq!(meta.mime(), "text/gemini"); 100 + assert_eq!(meta.parameters().len(), 2); 101 + assert_eq!(meta.parameters().get("valid"), Some(&"value".to_string())); 102 + assert_eq!(meta.parameters().get("another"), Some(&"test".to_string())); 103 + assert_eq!(meta.parameters().get("malformed"), None); 104 + } 93 105 }