use linked_hash_map::LinkedHashMap; pub fn parse_query_string(query_string: &str) -> LinkedHashMap> { let mut map = LinkedHashMap::new(); query_string.split('&').for_each(|kv| { let mut meet_equal = false; let mut k = String::new(); let mut v = String::new(); kv.chars().for_each(|c| { if meet_equal { v.push(c); } else if c == '=' { meet_equal = true; } else { k.push(c); } }); let k = percent_encoding::percent_decode_str(&k).decode_utf8_lossy().into_owned(); let v = percent_encoding::percent_decode_str(&v).decode_utf8_lossy().into_owned(); match map.get_mut(&k) { None => { map.insert(k, vec![v]); }, Some(values) => { values.push(v); }, } }); map } #[test] fn test_parse_query_string() { let mut e = LinkedHashMap::new(); e.insert("a".to_string(), vec!["b".to_string()]); let m = parse_query_string("a=b"); assert_eq!(e, m); let mut e = LinkedHashMap::new(); e.insert("a".to_string(), vec!["b".to_string(), "c".to_string()]); let m = parse_query_string("a=b&a=c"); assert_eq!(e, m); }