From 07f4e7d0f22a6bcd7b0d32ce7ff2795ad81b06f2 Mon Sep 17 00:00:00 2001 From: sigoden Date: Thu, 2 Jun 2022 19:43:43 +0800 Subject: [PATCH] fix: remove unzip file even failed to unzip --- src/server.rs | 50 +++++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/server.rs b/src/server.rs index 2d7779a..8cf2da4 100644 --- a/src/server.rs +++ b/src/server.rs @@ -260,27 +260,9 @@ impl InnerService { let query = req.uri().query().unwrap_or_default(); if query == "unzip" { - let root = path.parent().unwrap(); - let mut zip = ZipFileReader::new(File::open(&path).await?).await?; - for i in 0..zip.entries().len() { - let entry = &zip.entries()[i]; - let entry_name = entry.name(); - let entry_path = root.join(entry_name); - if entry_name.ends_with('/') { - fs::create_dir_all(entry_path).await?; - } else { - if !self.args.allow_delete && fs::metadata(&entry_path).await.is_ok() { - continue; - } - if let Some(parent) = entry_path.parent() { - if fs::symlink_metadata(parent).await.is_err() { - fs::create_dir_all(&parent).await?; - } - } - let mut outfile = fs::File::create(&entry_path).await?; - let mut reader = zip.entry_reader(i).await?; - io::copy(&mut reader, &mut outfile).await?; - } + if let Err(e) = self.unzip_file(path).await { + eprintln!("Failed to unzip {}, {}", path.display(), e); + status!(res, StatusCode::BAD_REQUEST); } fs::remove_file(&path).await?; } @@ -539,6 +521,32 @@ impl InnerService { .unwrap_or_default() } + async fn unzip_file(&self, path: &Path) -> BoxResult<()> { + let root = path.parent().unwrap(); + let mut zip = ZipFileReader::new(File::open(&path).await?).await?; + for i in 0..zip.entries().len() { + let entry = &zip.entries()[i]; + let entry_name = entry.name(); + let entry_path = root.join(entry_name); + if entry_name.ends_with('/') { + fs::create_dir_all(entry_path).await?; + } else { + if !self.args.allow_delete && fs::metadata(&entry_path).await.is_ok() { + continue; + } + if let Some(parent) = entry_path.parent() { + if fs::symlink_metadata(parent).await.is_err() { + fs::create_dir_all(&parent).await?; + } + } + let mut outfile = fs::File::create(&entry_path).await?; + let mut reader = zip.entry_reader(i).await?; + io::copy(&mut reader, &mut outfile).await?; + } + } + Ok(()) + } + fn extract_path(&self, path: &str) -> Option { let decoded_path = percent_decode(path[1..].as_bytes()).decode_utf8().ok()?; let slashes_switched = if cfg!(windows) {