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)); + } }