From 9b412c1916f8532987dc070d0dfff90984ca5afc Mon Sep 17 00:00:00 2001 From: Darius Auding <Darius.auding@gmx.de> Date: Tue, 13 Jun 2023 21:30:47 +0200 Subject: [PATCH] Add test for multipart form data and boundary getter in request.rs --- core/http/src/handling/request.rs | 64 ++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/core/http/src/handling/request.rs b/core/http/src/handling/request.rs index 5267de1..760bd3c 100644 --- a/core/http/src/handling/request.rs +++ b/core/http/src/handling/request.rs @@ -116,16 +116,26 @@ impl Request<'_> { keys: &[&'a str], data: &Data, ) -> Result<HashMap<&str, Result<Vec<u8>, ParseFormError>>, ParseFormError> { + let boundary; let post_type = if let Some(val) = self .headers .iter() .find(|header| header.contains("Content-Type: ")) { - if let Ok(mime_type) = val.strip_prefix("Content-Type: ").unwrap().trim().parse() { - mime_type + let content_type = val.trim().strip_prefix("Content-Type: ").unwrap(); + let type_vec = content_type.split(';').collect::<Vec<&str>>(); + + boundary = if let Some(bound) = type_vec.iter().find(|part| part.contains("boundary=")) + { + bound.strip_prefix("boundary=").unwrap().trim_matches('"') + } else { + "" + }; + if let Ok(mime) = type_vec[0].trim().parse() { + mime } else { return Err(ParseFormError { - error: ParseErrors::NoData, + error: ParseErrors::BadData, }); } } else { @@ -177,6 +187,12 @@ impl Request<'_> { } } } + Mime::MultipartFormData => { + let mut temp_bound = "--".to_string(); + temp_bound.push_str(boundary); + let end_boundary = format!("{temp_bound}--").as_bytes().to_owned(); + let boundary = temp_bound.as_bytes(); + } _ => { return Err(ParseFormError { error: ParseErrors::BadData, @@ -334,15 +350,45 @@ mod test { method: crate::handling::methods::Method::Post, }; let data = Data { - buffer: b"message=24&message1=23".to_vec(), + buffer: b"message=23&message1=24".to_vec(), is_complete: true, }; + let map = req.get_post_data(&["message", "message1"], &data).unwrap(); + assert_eq!( + &b"23".to_vec(), + map.get("message").unwrap().as_ref().unwrap() + ); + assert_eq!( + &b"24".to_vec(), + map.get("message1").unwrap().as_ref().unwrap() + ); + let req = Request { + uri: "", + headers: vec!["Content-Type: multipart/form-data;boundary=\"boundary\"".to_string()], + method: crate::handling::methods::Method::Post, + }; + let data = Data { + buffer: b"--boundary +Content-Disposition: form-data; name=\"field1\" + +value1 +--boundary +Content-Disposition: form-data; name=\"field2\"; filename=\"example.txt\" + +value2 +--boundary-- +" + .to_vec(), + is_complete: true, + }; + let map = req.get_post_data(&["field1, field2"], &data).unwrap(); + assert_eq!( + &b"value1".to_vec(), + map.get("field1").unwrap().as_ref().unwrap() + ); assert_eq!( - vec![&Ok(b"23".to_vec()), &Ok(b"24".to_vec())], - req.get_post_data(&["message", "message1"], &data) - .unwrap() - .values() - .collect::<Vec<_>>() + &b"value2".to_vec(), + map.get("field2").unwrap().as_ref().unwrap() ); } } -- GitLab