From 02552e534c950b41a2415623bf5fa94d37c64656 Mon Sep 17 00:00:00 2001
From: Louis Capitanchik <contact@louiscap.co>
Date: Fri, 13 Apr 2018 15:23:50 +0100
Subject: [PATCH] Implement Log handler for files, implement File handler for
 _all_ uploads

---
 src/routing/mock_upload.rs | 45 +++++++++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 15 deletions(-)

diff --git a/src/routing/mock_upload.rs b/src/routing/mock_upload.rs
index 8f171ef..9ef566c 100644
--- a/src/routing/mock_upload.rs
+++ b/src/routing/mock_upload.rs
@@ -1,5 +1,5 @@
 use rocket::{Data, State};
-use formdata::{read_formdata};
+use formdata::{read_formdata, FilePart};
 use routing::request::ConvertedHeaders;
 use hyper::header::{Headers, ContentDisposition, DispositionParam};
 use rocket::request::FromRequest;
@@ -24,20 +24,9 @@ pub fn to_file(headers: ConvertedHeaders, conf: State<SwerveConfig>, upload: Dat
         create_dir("uploads");
 
         for file in data.files {
-            let (name, value) = file;
-            if name == String::from("upload") {
-                let content_disposition = value.headers.get::<ContentDisposition>().unwrap();
-                let file_name = filename_from_disposition(content_disposition);
-
-                let mut input = File::open(value.path.clone()).unwrap();
-                let mut output = OpenOptions::new()
-                    .write(true)
-                    .create(true)
-                    .open(PathBuf::from("uploads").join(file_name.clone().unwrap_or(String::from("upload_data"))))
-                    .unwrap();
-
-                copy(&mut input, &mut output).unwrap();
-                println!("File written to {}", file_name.unwrap());
+            match conf.file_handling {
+                HandlerMethod::Log => log_file(file),
+                HandlerMethod::File => upload_file(file),
             }
         }
         Ok(String::from("Complete"))
@@ -55,6 +44,32 @@ fn collect_fields(fields: Vec<(String, String)>) -> HashMap<String, String> {
     map
 }
 
+type Upload = (String, FilePart);
+
+fn upload_file(file: Upload) {
+    let (name, value) = file;
+    let content_disposition = value.headers.get::<ContentDisposition>().unwrap();
+    let file_name = filename_from_disposition(content_disposition);
+
+    let mut input = File::open(value.path.clone()).unwrap();
+    let mut output = OpenOptions::new()
+        .write(true)
+        .create(true)
+        .open(PathBuf::from("uploads").join(file_name.clone().unwrap_or(String::from("upload_data"))))
+        .unwrap();
+
+    copy(&mut input, &mut output).unwrap();
+    println!("File written to {}", file_name.unwrap());
+}
+
+fn log_file(file: Upload) {
+    let (name, value) = file;
+    println!("[UPLOAD] From field: {}. Size: {}", name, value.size.unwrap_or(0));
+    for header in value.headers.iter() {
+        println!("[UPLOAD] :: {}; {}", header.name(), header.value_string());
+    }
+}
+
 fn filename_from_disposition(dispo: &ContentDisposition) -> Option<String> {
     for param in dispo.parameters.iter() {
         if let &DispositionParam::Filename(_, _, ref name_vec) = param {
-- 
GitLab