Skip to content
Snippets Groups Projects
Commit d13f4659 authored by codecraft's avatar codecraft :crocodile:
Browse files

working on post

parent 39889425
No related branches found
No related tags found
1 merge request!1Initial feature merge
...@@ -30,13 +30,13 @@ pub enum MediaType { ...@@ -30,13 +30,13 @@ pub enum MediaType {
Html, Html,
} }
#[derive(Debug)] #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum ParseErrors { pub enum ParseErrors {
NoData, NoData,
BadData, BadData,
} }
#[derive(Debug)] #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct ParseFormError { pub struct ParseFormError {
pub error: ParseErrors, pub error: ParseErrors,
} }
...@@ -111,18 +111,18 @@ impl Request<'_> { ...@@ -111,18 +111,18 @@ impl Request<'_> {
Ok(response) Ok(response)
} }
pub fn get_post_data( pub fn get_post_data<'a>(
&self, &'a self,
keys: &[&str], keys: &[&'a str],
data: &Data, data: &Data,
) -> Result<HashMap<&str, Result<Vec<u8>, ParseFormError>>, ParseFormError> { ) -> Result<HashMap<&str, Result<Vec<u8>, ParseFormError>>, ParseFormError> {
let mut post_type = if let Some(val) = self let post_type = if let Some(val) = self
.headers .headers
.iter() .iter()
.find(|header| header.contains("Content-Type: ")) .find(|header| header.contains("Content-Type: "))
{ {
if let Ok(Type) = val.strip_prefix("Content-Type: ").unwrap().trim().parse() { if let Ok(mime_type) = val.strip_prefix("Content-Type: ").unwrap().trim().parse() {
Type mime_type
} else { } else {
return Err(ParseFormError { return Err(ParseFormError {
error: ParseErrors::NoData, error: ParseErrors::NoData,
...@@ -135,17 +135,52 @@ impl Request<'_> { ...@@ -135,17 +135,52 @@ impl Request<'_> {
}; };
let data = data.buffer.as_slice(); let data = data.buffer.as_slice();
let mut keymap: HashMap<&str, Option<&[u8]>> = HashMap::with_capacity(keys.len()); let mut keymap: HashMap<&str, Result<Vec<u8>, ParseFormError>> =
for i in keys { HashMap::with_capacity(keys.len());
keymap.entry(i).or_default(); for key in keys {
keymap.entry(key).or_insert(Err(ParseFormError {
error: ParseErrors::NoData,
}));
} }
match post_type { match post_type {
Mime::ApplicationXWwwFormUrlencoded => Ok(()), Mime::ApplicationXWwwFormUrlencoded => {
_ => Err(ParseFormError { for kvp in data.split(|byte| *byte == b'&') {
error: ParseErrors::BadData, let kvp = kvp.split(|byte| *byte == b'=').collect::<Vec<&[u8]>>();
}), let key = if let Some(kv) = kvp.get(0) {
kv
} else {
return Err(ParseFormError {
error: ParseErrors::BadData,
});
};
let key = if let Ok(kv) = String::from_utf8(key.to_vec()) {
kv
} else {
return Err(ParseFormError {
error: ParseErrors::BadData,
});
};
let value = kvp.get(1).ok_or(ParseFormError {
error: ParseErrors::NoData,
});
let thing = if let Some(val) = keymap.get_mut(key.as_str()) {
val
} else {
continue;
};
*thing = match value {
Ok(val) => Ok(val.to_vec()),
Err(err) => Err(err),
}
}
}
_ => {
return Err(ParseFormError {
error: ParseErrors::BadData,
})
}
}; };
todo!() Ok(keymap)
} }
// pub fn get_post_text_form_key( // pub fn get_post_text_form_key(
...@@ -288,38 +323,23 @@ mod test { ...@@ -288,38 +323,23 @@ mod test {
use super::Request; use super::Request;
// #[test] #[test]
// fn try_post_text() { fn try_post_text() {
// let req = Request { let req = Request {
// uri: "", uri: "",
// headers: vec!["Content-Type: multipart/form-data;boundary=\"boundary\"".to_string()], headers: vec!["Content-Type: application/x-www-form-urlencoded".to_string()],
// method: crate::handling::methods::Method::Post, method: crate::handling::methods::Method::Post,
// }; };
// let data = Data { let data = Data {
// buffer: b"--boundary\r buffer: b"message=23&message1=24".to_vec(),
// Content-Disposition: form-data; name=\"field1\"\r is_complete: true,
// \r };
// value1\r assert_eq!(
// --boundary\r vec![&Ok(b"23".to_vec()), &Ok(b"24".to_vec())],
// Content-Disposition: form-data; name=\"field2\"; filename=\"example.txt\"\n\r req.get_post_data(&["message", "message1"], &data)
// \r .unwrap()
// value2\r .values()
// --boundary--" .collect::<Vec<_>>()
// .to_vec(), );
// is_complete: true, }
// };
// assert_eq!(
// "value1",
// req.get_post_text_form_key(&["field1"], &data).unwrap()[0]
// );
// assert_eq!(
// "value2",
// req.get_post_text_form_key(&["field2"], &data).unwrap()[0]
// );
// assert_eq!(
// vec!["value1", "value2"],
// req.get_post_text_form_key(&["field1", "field2"], &data)
// .unwrap()
// )
// }
} }
...@@ -96,7 +96,7 @@ pub async fn build(ip: &str) -> Config { ...@@ -96,7 +96,7 @@ pub async fn build(ip: &str) -> Config {
let ip = ip[0]; let ip = ip[0];
let workers = available_parallelism().unwrap().get(); let workers = available_parallelism().unwrap().get();
println!( println!(
"\x1b[34m⚙ Configuration\x1b[0m "\x1b[34m⚙ Configuration\x1b[0m
>> \x1b[34mIp\x1b[0m: {ip} >> \x1b[34mIp\x1b[0m: {ip}
>> \x1b[34mPort\x1b[0m: {port} >> \x1b[34mPort\x1b[0m: {port}
>> \x1b[34mWorkers\x1b[0m: {workers} >> \x1b[34mWorkers\x1b[0m: {workers}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment