refactor: add util.rs
This commit is contained in:
40
src/main.rs
40
src/main.rs
@@ -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
38
src/util.rs
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user