Files
proxy-get-service/src/util.rs

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);
}