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