diff --git a/Cargo.lock b/Cargo.lock index 35b5cde..dfa672a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,7 +22,7 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "loadstar" -version = "0.0.5" +version = "0.0.6" dependencies = [ "tiny_http", ] diff --git a/Cargo.toml b/Cargo.toml index d234736..633a256 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "loadstar" description = "A simple web framework for rust" repository = "https://git.kjan.de/jank/loadstar" -version = "0.0.5" +version = "0.0.6" license = "GPL-3.0-only" edition = "2021" diff --git a/src/entities/request.rs b/src/entities/request.rs index f0aedc9..147f218 100644 --- a/src/entities/request.rs +++ b/src/entities/request.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use tiny_http::Request; pub trait Url { @@ -10,6 +12,51 @@ impl Url for Request { } } +pub trait Parameters { + fn get_post_parameters(&mut self) -> HashMap; + fn get_get_parameters(&mut self) -> Option>; +} + +impl Parameters for Request { + fn get_post_parameters(&mut self) -> HashMap { + let mut content = String::new(); + self.as_reader().read_to_string(&mut content).unwrap(); + + let mut key_value_pairs = HashMap::new(); + + let parts = content.split("&"); + + for part in parts { + let mut key_value = part.split("="); + + key_value_pairs.insert(key_value.next().unwrap().to_string(), key_value.next().unwrap().to_string()); + } + + key_value_pairs + } + + fn get_get_parameters(&mut self) -> Option> { + let content = self.url().split("?").nth(1); + + if content.is_none() { + return None; + } + + let content = content.unwrap(); + + let mut key_value_pairs = HashMap::new(); + + let parts = content.split("&"); + for part in parts { + let mut key_value = part.split("="); + + key_value_pairs.insert(key_value.next().unwrap().to_string(), key_value.next().unwrap().to_string()); + } + + Some(key_value_pairs) + } +} + #[cfg(test)] mod tests { use crate::entities::request::*; @@ -27,4 +74,40 @@ mod tests { assert_eq!(request2.get_url_without_parameters(), "/test2"); } + + #[test] + fn test_get_post_parameters() { + let test_request = TestRequest::new(); + let test_request = test_request.with_body("a=b&c=d"); + + let actual = Request::from(test_request).get_post_parameters(); + let mut expected = HashMap::new(); + expected.insert("a".to_string(), "b".to_string()); + expected.insert("c".to_string(), "d".to_string()); + + assert_eq!(actual, expected); + } + + #[test] + fn test_get_get_parameters_with_no_get_parameters() { + let test_request = TestRequest::new(); + let test_request = test_request.with_path("/test"); + + let actual = Request::from(test_request).get_get_parameters(); + + assert_eq!(actual, None); + } + + #[test] + fn test_get_get_parameters() { + let test_request = TestRequest::new(); + let test_request = test_request.with_path("/test?a=b&c=d"); + + let actual = Request::from(test_request).get_get_parameters(); + let mut expected = HashMap::new(); + expected.insert("a".to_string(), "b".to_string()); + expected.insert("c".to_string(), "d".to_string()); + + assert_eq!(actual, Some(expected)); + } }