From 374dcc3e1e454421e0d18bd39f1cbe37410bb53b Mon Sep 17 00:00:00 2001
From: Darius Auding <Darius.auding@gmx.de>
Date: Mon, 5 Jun 2023 21:19:48 +0200
Subject: [PATCH] Update `get_post_form_text` to allow for an array of keys to
 search

---
 core/http/src/handling/request.rs | 70 +++++++++++++++++++++----------
 1 file changed, 48 insertions(+), 22 deletions(-)

diff --git a/core/http/src/handling/request.rs b/core/http/src/handling/request.rs
index 5f02d3d..12947a6 100644
--- a/core/http/src/handling/request.rs
+++ b/core/http/src/handling/request.rs
@@ -72,9 +72,9 @@ impl Request<'_> {
         }
     }
     // pub fn get_post_form_key<T: FromRequest>(&self, data: Data) -> T {}
-    pub fn get_get_form_keys(
-        &self,
-        keys: Vec<&str>,
+    pub fn get_get_form_keys<'a>(
+        &'a self,
+        keys: &'a [&str],
     ) -> Result<HashMap<&str, &str>, ParseFormError> {
         let data = if let Some(val) = self.uri.split_once("?") {
             val
@@ -111,7 +111,11 @@ impl Request<'_> {
         }
         Ok(response)
     }
-    pub fn get_post_text_form_key(&self, key: &str, data: &Data) -> Result<String, ()> {
+    pub fn get_post_text_form_key(
+        &self,
+        keys: &[&str],
+        data: &Data,
+    ) -> Result<Vec<String>, ParseFormError> {
         let mut post_type = self
             .headers
             .iter()
@@ -134,11 +138,18 @@ impl Request<'_> {
                     .split("&")
                     .map(|kvp| kvp.split_once("=").unwrap())
                     .collect::<HashMap<&str, &str>>();
-                if let Some(val) = kvps.get(key) {
-                    Ok(val.to_string())
-                } else {
-                    Err(())
+
+                let mut result: Vec<String> = Vec::with_capacity(keys.len());
+                for key in keys {
+                    if let Some(val) = kvps.get(key) {
+                        result.push(val.to_string());
+                    } else {
+                        return Err(ParseFormError {
+                            error: ParseErrors::NoData,
+                        });
+                    }
                 }
+                Ok(result)
             }
             Mime::MultipartFormData => {
                 let from_req = post_type[1..]
@@ -158,16 +169,17 @@ impl Request<'_> {
                     .collect::<Vec<&[u8]>>();
 
                 let mut boundary_found = false;
-                let mut key_found = false;
-                let mut value = vec![];
+                let mut current_key: Option<usize> = None;
+                let mut result: Vec<Vec<u8>> = vec!["".into(); keys.len()];
                 for part in parts {
                     if part == [] {
                         continue;
                     }
-                    if (key_found && part == boundary) || part == end_boundary {
+                    if part == end_boundary {
                         break;
                     }
                     if !boundary_found && part == boundary {
+                        current_key = None;
                         boundary_found = true;
                         continue;
                     }
@@ -188,18 +200,27 @@ impl Request<'_> {
                             .trim_end()
                             .trim_matches('"')
                             .to_owned();
-                        key_found = key == mkey;
-                    } else if key_found == true {
-                        value.extend_from_slice(part);
-                        value.extend_from_slice(&[b'\n']);
+                        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(String::from_utf8_lossy(&value)
-                    .to_owned()
-                    .trim()
-                    .to_string())
+                Ok(result
+                    .iter()
+                    .map(|arr| String::from_utf8(arr.to_vec()).unwrap().trim().into())
+                    .collect())
             }
-            _ => Err(()),
+            _ => Err(ParseFormError {
+                error: ParseErrors::BadData,
+            }),
         }
     }
 }
@@ -232,11 +253,16 @@ value2\r
         };
         assert_eq!(
             "value1",
-            req.get_post_text_form_key("field1", &data).unwrap()
+            req.get_post_text_form_key(&["field1"], &data).unwrap()[0]
         );
         assert_eq!(
             "value2",
-            req.get_post_text_form_key("field2", &data).unwrap()
+            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()
+        )
     }
 }
-- 
GitLab