From 06298ba4f4c87dfae797798d581cb3059860cecb Mon Sep 17 00:00:00 2001 From: sunli Date: Sun, 7 Jun 2020 16:32:05 +0800 Subject: [PATCH] Fix upload seems broken in the new version. #160 --- src/http/into_query_builder.rs | 71 +++++++++++++++++----------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/src/http/into_query_builder.rs b/src/http/into_query_builder.rs index 183a2463..7e600c2e 100644 --- a/src/http/into_query_builder.rs +++ b/src/http/into_query_builder.rs @@ -63,6 +63,7 @@ where let mut builder = None; let mut map = None; + let mut files = Vec::new(); while let Some(mut field) = multipart.next_field().await? { match field.name() { @@ -80,52 +81,50 @@ where ); } _ => { - let builder = match &mut builder { - Some(builder) => builder, - None => return Err(ParseRequestError::MissingOperatorsPart), - }; - let map = match &mut map { - Some(map) => map, - None => return Err(ParseRequestError::MissingMapPart), - }; - if let Some(name) = field.name() { + if let Some(name) = field.name().map(ToString::to_string) { if let Some(filename) = field.file_name().map(ToString::to_string) { - if let Some(var_paths) = map.remove(name) { - let content_type = - field.content_type().map(|mime| mime.to_string()); - let mut file = - tempfile::tempfile().map_err(ParseRequestError::Io)?; - while let Some(chunk) = field.chunk().await.unwrap() { - file.write(&chunk).map_err(ParseRequestError::Io)?; - } - file.seek(SeekFrom::Start(0))?; - for var_path in var_paths { - builder.set_upload( - &var_path, - filename.clone(), - content_type.clone(), - file.try_clone().unwrap(), - ); - } + let content_type = + field.content_type().map(|mime| mime.to_string()); + let mut file = + tempfile::tempfile().map_err(ParseRequestError::Io)?; + while let Some(chunk) = field.chunk().await.unwrap() { + file.write(&chunk).map_err(ParseRequestError::Io)?; } + file.seek(SeekFrom::Start(0))?; + files.push((name, filename, content_type, file)); } } } } } - if let Some(map) = &map { - if !map.is_empty() { - return Err(ParseRequestError::MissingFiles); - } - } else { - return Err(ParseRequestError::MissingMapPart); - } - - Ok(match builder { + let mut builder = match builder { Some(builder) => builder, None => return Err(ParseRequestError::MissingOperatorsPart), - }) + }; + let map = match &mut map { + Some(map) => map, + None => return Err(ParseRequestError::MissingMapPart), + }; + + for (name, filename, content_type, file) in files { + if let Some(var_paths) = map.remove(&name) { + for var_path in var_paths { + builder.set_upload( + &var_path, + filename.clone(), + content_type.clone(), + file.try_clone().unwrap(), + ); + } + } + } + + if !map.is_empty() { + return Err(ParseRequestError::MissingFiles); + } + + Ok(builder) } else { let mut data = Vec::new(); self.1