39 lines
1.2 KiB
Rust
39 lines
1.2 KiB
Rust
use linked_hash_map::LinkedHashMap;
|
|
|
|
pub fn parse_query_string(query_string: &str) -> LinkedHashMap<String, Vec<String>> {
|
|
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);
|
|
}
|