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

Working on new get post data function

parent 4fe55b12
No related branches found
No related tags found
No related merge requests found
...@@ -110,119 +110,176 @@ impl Request<'_> { ...@@ -110,119 +110,176 @@ impl Request<'_> {
} }
Ok(response) Ok(response)
} }
pub fn get_post_text_form_key(
pub fn get_post_data(
&self, &self,
keys: &[&str], keys: &[&str],
data: &Data, data: &Data,
) -> Result<HashMap<&str, Result<&str, ParseFormError>>, ParseFormError> { ) -> Result<HashMap<&str, Result<Vec<u8>, ParseFormError>>, ParseFormError> {
let mut post_type = self let mut post_type = if let Some(val) = self
.headers .headers
.iter() .iter()
.find(|header| header.contains("Content-Type: ")) .find(|header| header.contains("Content-Type: "))
.unwrap() {
.to_string(); if let Ok(Type) = val.strip_prefix("Content-Type: ").unwrap().trim().parse() {
Type
post_type = post_type } else {
.strip_prefix("Content-Type: ") return Err(ParseFormError {
.unwrap() error: ParseErrors::NoData,
.to_string(); });
let post_type: Vec<&str> = post_type.trim().split(';').collect();
let mime_type = post_type[0].parse::<Mime>().unwrap();
let mut result = HashMap::new();
match mime_type {
Mime::ApplicationXWwwFormUrlencoded => {
let data = String::from_utf8(data.buffer.clone()).unwrap();
let kvps = data
.split("&")
.map(|kvp| kvp.split_once("=").unwrap())
.collect::<HashMap<&str, &str>>();
for key in keys {
let entry = if let Some(val) = kvps.get(key) {
Ok(*val)
} else {
Err(ParseFormError {
error: ParseErrors::NoData,
})
};
result.insert(*key, entry);
}
Ok(result)
} }
Mime::MultipartFormData => { } else {
let from_req = post_type[1..] return Err(ParseFormError {
.iter() error: ParseErrors::NoData,
.find(|val| val.contains("boundary=")) });
.unwrap() };
.strip_prefix("boundary=")
.unwrap();
let mut boundary = b"--".to_vec();
boundary.extend_from_slice(from_req.trim_matches('"').as_bytes());
let mut end_boundary = boundary.clone();
end_boundary.extend_from_slice(b"--");
boundary.extend_from_slice(&[b'\r']);
let parts = data
.buffer
.split(|byte| byte == &b'\n')
.collect::<Vec<&[u8]>>();
let mut boundary_found = false; let data = data.buffer.as_slice();
let mut current_key: Option<usize> = None; let mut keymap: HashMap<&str, Option<&[u8]>> = HashMap::with_capacity(keys.len());
let mut result: Vec<Vec<u8>> = vec!["".into(); keys.len()]; for i in keys {
for part in parts { keymap.entry(i).or_default();
if part == [] { }
continue; match post_type {
} Mime::ApplicationXWwwFormUrlencoded => Ok(()),
if part == end_boundary {
break;
}
if !boundary_found && part == boundary {
current_key = None;
boundary_found = true;
continue;
}
if part.starts_with(b"Content-Disposition: form-data; name=") {
let headers = part
.split(|byte| byte == &b';')
.filter(|header| !header.is_empty())
.collect::<Vec<_>>();
if headers.len() < 2 {
continue;
}
let name = headers[1].split(|byte| byte == &b'=').collect::<Vec<_>>();
if name.len() != 2 {
continue;
}
let mkey = String::from_utf8_lossy(name[1])
.to_string()
.trim_end()
.trim_matches('"')
.to_owned();
let mut index = 0;
for i in keys {
if *i == mkey {
current_key = Some(index);
}
index += 1;
}
boundary_found = false;
} else if let Some(key) = current_key {
result[key].extend_from_slice(part);
result[key].extend_from_slice(&[b'\n']);
}
}
Ok(result
.iter()
.map(|arr| String::from_utf8(arr.to_vec()).unwrap().trim().into())
.collect())
}
_ => Err(ParseFormError { _ => Err(ParseFormError {
error: ParseErrors::BadData, error: ParseErrors::BadData,
}), }),
} };
todo!()
} }
// pub fn get_post_text_form_key(
// &self,
// keys: &[&str],
// data: &Data,
// ) -> Result<HashMap<&str, Result<&str, ParseFormError>>, ParseFormError> {
// let mut post_type = self
// .headers
// .iter()
// .find(|header| header.contains("Content-Type: "))
// .unwrap()
// .to_string();
//
// post_type = post_type
// .strip_prefix("Content-Type: ")
// .unwrap()
// .to_string();
//
// let post_type: Vec<&str> = post_type.trim().split(';').collect();
// let mime_type = post_type[0].parse().unwrap();
//
// // let data = String::from_utf8(vec)
//
// let mut result = HashMap::new();
// match mime_type {
// Mime::ApplicationXWwwFormUrlencoded => {
// let data = String::from_utf8(data.buffer.clone()).unwrap();
// let kvps = data
// .split("&")
// .map(|kvp| kvp.split_once("=").unwrap())
// .collect::<HashMap<&str, &str>>();
//
// for key in keys {
// let entry = if let Some(val) = kvps.get(key) {
// Ok(*val)
// } else {
// Err(ParseFormError {
// error: ParseErrors::NoData,
// })
// };
// result.insert(*key, entry);
// }
// Ok(result)
// }
// Mime::MultipartFormData => {
// let from_req = post_type[1..]
// .iter()
// .find(|val| val.contains("boundary="))
// .unwrap()
// .strip_prefix("boundary=")
// .unwrap();
// let mut boundary = b"--".to_vec();
// boundary.extend_from_slice(from_req.trim_matches('"').as_bytes());
// let mut end_boundary = boundary.clone();
// end_boundary.extend_from_slice(b"--");
// boundary.extend_from_slice(&[b'\r']);
// let parts = data
// .buffer
// .split(|byte| byte == &b'\n')
// .collect::<Vec<&[u8]>>();
//
// let mut boundary_found = false;
// let mut current_key: Option<&str> = None;
// let mut result: HashMap<&str, Vec<u8>> = HashMap::new();
// for part in parts {
// if part == [] {
// continue;
// }
// if part == end_boundary {
// break;
// }
// if !boundary_found && part == boundary {
// current_key = None;
// boundary_found = true;
// continue;
// }
// if part.starts_with(b"Content-Disposition: form-data; name=") {
// let headers = part
// .split(|byte| byte == &b';')
// .filter(|header| !header.is_empty())
// .collect::<Vec<_>>();
// if headers.len() < 2 {
// continue;
// }
// let name = headers[1].split(|byte| byte == &b'=').collect::<Vec<_>>();
// if name.len() != 2 {
// continue;
// }
// let mkey = String::from_utf8_lossy(name[1])
// .as_ref()
// .trim_end()
// .trim_matches('"')
// .to_owned();
// for i in keys {
// if *i == mkey {
// current_key = Some(&mkey);
// }
// }
// boundary_found = false;
// } else if let Some(key) = current_key {
// if None == result.get(key) {
// result.insert(key, part.to_vec());
// continue;
// }
// result.get_mut(key).unwrap().extend_from_slice(part);
// }
// }
// if result.len() == 0 {
// return Err(ParseFormError {
// error: ParseErrors::NoData,
// });
// }
// let return_result: HashMap<&str, Result<&str, ParseErrors>> =
// HashMap::with_capacity(keys.len());
//
// for key in keys {
// let val = result.get(key).ok_or(ParseFormError {
// error: ParseErrors::NoData,
// }).map(|value| String::from_utf8(value))
// let val = if let Ok(str) = String::from_utf8(val) {
// Ok(str)
// } else {
// Err(ParseFormError {
// error: ParseErrors::BadData,
// })
// };
// }
// }
// _ => Err(ParseFormError {
// error: ParseErrors::BadData,
// }),
// }
// }
} }
#[cfg(test)] #[cfg(test)]
...@@ -231,38 +288,38 @@ mod test { ...@@ -231,38 +288,38 @@ 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: multipart/form-data;boundary=\"boundary\"".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"--boundary\r
Content-Disposition: form-data; name=\"field1\"\r // Content-Disposition: form-data; name=\"field1\"\r
\r // \r
value1\r // value1\r
--boundary\r // --boundary\r
Content-Disposition: form-data; name=\"field2\"; filename=\"example.txt\"\n\r // Content-Disposition: form-data; name=\"field2\"; filename=\"example.txt\"\n\r
\r // \r
value2\r // value2\r
--boundary--" // --boundary--"
.to_vec(), // .to_vec(),
is_complete: true, // is_complete: true,
}; // };
assert_eq!( // assert_eq!(
"value1", // "value1",
req.get_post_text_form_key(&["field1"], &data).unwrap()[0] // req.get_post_text_form_key(&["field1"], &data).unwrap()[0]
); // );
assert_eq!( // assert_eq!(
"value2", // "value2",
req.get_post_text_form_key(&["field2"], &data).unwrap()[0] // req.get_post_text_form_key(&["field2"], &data).unwrap()[0]
); // );
assert_eq!( // assert_eq!(
vec!["value1", "value2"], // vec!["value1", "value2"],
req.get_post_text_form_key(&["field1", "field2"], &data) // req.get_post_text_form_key(&["field1", "field2"], &data)
.unwrap() // .unwrap()
) // )
} // }
} }
...@@ -3,17 +3,17 @@ use std::{collections::HashMap, path::PathBuf}; ...@@ -3,17 +3,17 @@ use std::{collections::HashMap, path::PathBuf};
use http::handling::{ use http::handling::{
file_handlers::NamedFile, file_handlers::NamedFile,
methods::Method, methods::Method,
request::Request, request::{Request, ParseFormError},
response::{Outcome, Response, ResponseBody, Status}, response::{Outcome, Response, ResponseBody, Status},
routes::{Data, Route}, routes::{Data, Route},
}; };
fn hashmap_to_string(map: &HashMap<&str, &str>) -> String { fn hashmap_to_string(map: &HashMap<&str, Result<&str, ParseFormError>>) -> String {
let mut result = String::new(); let mut result = String::new();
for (key, value) in map { for (key, value) in map {
result.push_str(key); result.push_str(key);
result.push('='); result.push('=');
result.push_str(value); result.push_str(value.as_ref().unwrap());
result.push(';'); result.push(';');
} }
result.pop(); // Remove the trailing semicolon if desired result.pop(); // Remove the trailing semicolon if desired
...@@ -21,7 +21,7 @@ fn hashmap_to_string(map: &HashMap<&str, &str>) -> String { ...@@ -21,7 +21,7 @@ fn hashmap_to_string(map: &HashMap<&str, &str>) -> String {
} }
fn handle_static_hi(request: Request<'_>, data: Data) -> Outcome<Response, Status, Data> { fn handle_static_hi(request: Request<'_>, data: Data) -> Outcome<Response, Status, Data> {
let keys = if let Ok(keys) = request.get_get_form_keys(vec!["asdf", "jkl"]) { let keys = if let Ok(keys) = request.get_get_form_keys(&["asdf", "jkl"]) {
keys keys
} else { } else {
return Outcome::Forward(data); return Outcome::Forward(data);
...@@ -62,12 +62,12 @@ fn post_hi_handler(request: Request, data: Data) -> Outcome<Response, Status, Da ...@@ -62,12 +62,12 @@ fn post_hi_handler(request: Request, data: Data) -> Outcome<Response, Status, Da
if data.is_empty() { if data.is_empty() {
return Outcome::Forward(data); return Outcome::Forward(data);
} }
let data = if let Ok(val) = request.get_post_text_form_key("message", &data) { // let data = if let Ok(val) = request.get_post_text_form_key("message", &data) {
val // val
} else { // } else {
return Outcome::Failure(Status::BadRequest); // return Outcome::Failure(Status::BadRequest);
}; // };
let dat = post_hi(data); let dat = post_hi(String::from_utf8(data.buffer).unwrap());
Outcome::Success(Response { Outcome::Success(Response {
headers: vec![ headers: vec![
format!("Content-Length: {}", dat.len()), format!("Content-Length: {}", dat.len()),
......
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