From d78d416a07c4d0418aed55ed75b47a2bd71c5f3c Mon Sep 17 00:00:00 2001 From: "Hatter Jiang@Pixelbook" Date: Sat, 15 Aug 2020 10:35:17 +0800 Subject: [PATCH] refactor: add util.rs --- src/main.rs | 40 ++-------------------------------------- src/util.rs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 38 deletions(-) create mode 100644 src/util.rs diff --git a/src/main.rs b/src/main.rs index 7f0500a..e362bab 100644 --- a/src/main.rs +++ b/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> { - 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); -} diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..4c85f77 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,38 @@ +use linked_hash_map::LinkedHashMap; + +pub fn parse_query_string(query_string: &str) -> LinkedHashMap> { + 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); +}