impl an HTTPMessage corresponding to the JSON response body

This commit is contained in:
landrigun 2022-10-13 10:33:11 +00:00
parent 88c2e99aa8
commit 808cd3ee77
2 changed files with 79 additions and 0 deletions

77
src/http/message.rs Normal file
View 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());
}

View File

@ -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;