impl an HTTPMessage corresponding to the JSON response body
This commit is contained in:
		
							parent
							
								
									88c2e99aa8
								
							
						
					
					
						commit
						808cd3ee77
					
				
							
								
								
									
										77
									
								
								src/http/message.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								src/http/message.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | |||||||
|  | use json; | ||||||
|  | use std::collections::HashMap; | ||||||
|  | 
 | ||||||
|  | const JSON_DELIMITER: &'static str = ","; | ||||||
|  | 
 | ||||||
|  | /// `HashMap` wrapper, represents the JSON response body
 | ||||||
|  | pub struct HTTPMessage { | ||||||
|  |     message: HashMap<String, String>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Default for HTTPMessage { | ||||||
|  |     fn default() -> Self { | ||||||
|  |         HTTPMessage { | ||||||
|  |             message: HashMap::new(), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// try to convert `HTTPMessage` in `json::JsonValue`
 | ||||||
|  | impl TryInto<json::JsonValue> for HTTPMessage { | ||||||
|  |     type Error = String; | ||||||
|  |     fn try_into(self) -> Result<json::JsonValue, Self::Error> { | ||||||
|  |         let message = format!(r#"{{{}}}"#, self.build_json()); | ||||||
|  |         println!("message: {}", message); | ||||||
|  |         match json::parse(&message) { | ||||||
|  |             Ok(r) => Ok(r), | ||||||
|  |             Err(e) => Err(format!( | ||||||
|  |                 "unable to parse the HTTPMessage correctly: {}, err={}", | ||||||
|  |                 message, e | ||||||
|  |             )), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl HTTPMessage { | ||||||
|  |     fn put(&mut self, key: &str, value: &str) { | ||||||
|  |         self.message.insert(key.to_string(), value.to_string()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /// loops over all the HashMap keys, builds a JSON key value for each one and join them with `JSON_DELIMITER`
 | ||||||
|  |     fn build_json(self) -> String { | ||||||
|  |         let unstruct: Vec<String> = self | ||||||
|  |             .message | ||||||
|  |             .keys() | ||||||
|  |             .map(|k| format!(r#""{}":{:?}"#, k, self.message.get(k).unwrap())) | ||||||
|  |             .collect(); | ||||||
|  |         let joined = unstruct.join(JSON_DELIMITER); | ||||||
|  |         joined | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[test] | ||||||
|  | fn test_message() { | ||||||
|  |     let mut http_message = HTTPMessage::default(); | ||||||
|  |     http_message.put("username", "toto"); | ||||||
|  |     http_message.put("password", "tata"); | ||||||
|  | 
 | ||||||
|  |     let mut json_result: Result<json::JsonValue, String> = http_message.try_into(); | ||||||
|  |     assert!(json_result.is_ok()); | ||||||
|  | 
 | ||||||
|  |     let mut json = json_result.unwrap(); | ||||||
|  |     assert!(json.has_key("username")); | ||||||
|  |     assert!(json.has_key("password")); | ||||||
|  | 
 | ||||||
|  |     let empty_http_message = HTTPMessage::default(); | ||||||
|  |     json_result = empty_http_message.try_into(); | ||||||
|  |     assert!(json_result.is_ok()); | ||||||
|  | 
 | ||||||
|  |     json = json_result.unwrap(); | ||||||
|  |     assert_eq!("{}", json.dump().to_string()); | ||||||
|  | 
 | ||||||
|  |     let mut bad_http_message = HTTPMessage::default(); | ||||||
|  |     bad_http_message.put("\"", ""); | ||||||
|  | 
 | ||||||
|  |     json_result = bad_http_message.try_into(); | ||||||
|  |     assert!(json_result.is_err()); | ||||||
|  | } | ||||||
| @ -1,9 +1,11 @@ | |||||||
| //! http module includes tools to parse an HTTP request and build and HTTP response
 | //! http module includes tools to parse an HTTP request and build and HTTP response
 | ||||||
| 
 | 
 | ||||||
|  | pub mod message; | ||||||
| pub mod request; | pub mod request; | ||||||
| pub mod response; | pub mod response; | ||||||
| pub mod router; | pub mod router; | ||||||
| 
 | 
 | ||||||
|  | pub use message::HTTPMessage; | ||||||
| pub use request::HTTPRequest; | pub use request::HTTPRequest; | ||||||
| pub use response::{HTTPResponse, HTTPStatusCode}; | pub use response::{HTTPResponse, HTTPStatusCode}; | ||||||
| pub use router::ROUTER; | pub use router::ROUTER; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user