refactor: add util.rs

This commit is contained in:
2020-08-15 10:35:17 +08:00
parent 15e550ed42
commit d78d416a07
2 changed files with 40 additions and 38 deletions

View File

@@ -2,15 +2,16 @@
extern crate rust_util;
mod error;
mod util;
use std::pin::Pin;
use std::task::{ Context, Poll };
use bytes::Bytes;
use clap::{ App, Arg };
use linked_hash_map::LinkedHashMap;
use actix_web::{ web, HttpServer, HttpRequest, HttpResponse };
use error::*;
use util::*;
const DEFAULT_PORT: u16 = 8888;
@@ -90,40 +91,3 @@ async fn main() -> std::io::Result<()> {
.run()
.await
}
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);
}

38
src/util.rs Normal file
View File

@@ -0,0 +1,38 @@
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);
}