diff options
author | boasting-squirrel <boasting.squirrel@gmail.com> | 2019-03-08 19:25:02 +0000 |
---|---|---|
committer | boasting-squirrel <boasting.squirrel@gmail.com> | 2019-03-08 19:25:02 +0000 |
commit | e7c269b12ec8168671e61787227d0fecc2756590 (patch) | |
tree | 5e49d6b6b06428b225d6a23dfca20ce21fde1907 /src | |
parent | Download folder as a tar working (diff) | |
download | miniserve-e7c269b12ec8168671e61787227d0fecc2756590.tar.gz miniserve-e7c269b12ec8168671e61787227d0fecc2756590.zip |
Working example of tar.gz
Diffstat (limited to 'src')
-rw-r--r-- | src/archive.rs | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/archive.rs b/src/archive.rs index cc39207..47af660 100644 --- a/src/archive.rs +++ b/src/archive.rs @@ -1,7 +1,8 @@ use bytes::Bytes; +use libflate::gzip::Encoder; use serde::Deserialize; use std::fs::{File, OpenOptions}; -use std::io::Read; +use std::io::{self, Read}; use std::path::PathBuf; use tar::Builder; use tempfile::tempdir; @@ -61,6 +62,7 @@ fn tgz_compress(dir: &PathBuf) -> Result<(String, usize, Bytes), CompressionErro let src_dir = dir.display().to_string(); let inner_folder = dir.file_name()?.to_str()?; let dst_filename = format!("{}.tar", inner_folder); + let dst_tgz_filename = format!("{}.gz", dst_filename); let tmp_dir = tempdir()?; let dst_filepath = tmp_dir.path().join(dst_filename.clone()); @@ -70,11 +72,21 @@ fn tgz_compress(dir: &PathBuf) -> Result<(String, usize, Bytes), CompressionErro tar_builder.finish()?; let mut tar_file = OpenOptions::new().read(true).open(&dst_filepath)?; - let mut contents = Vec::new(); - let content_length = tar_file.read_to_end(&mut contents).unwrap(); + let mut tar_content = Vec::new(); + let content_length = tar_file.read_to_end(&mut tar_content).unwrap(); + + let gz_data = gzip(&mut tar_content)?; let mut data = Bytes::new(); - data.extend_from_slice(&contents); + data.extend_from_slice(&gz_data); + + Ok((dst_tgz_filename, content_length, data)) +} + +fn gzip(mut data: &[u8]) -> Result<Vec<u8>, CompressionError> { + let mut encoder = Encoder::new(Vec::new())?; + io::copy(&mut data, &mut encoder)?; + let data = encoder.finish().into_result()?; - Ok((dst_filename, content_length, data)) + Ok(data) } |