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