diff --git a/Cargo.lock b/Cargo.lock index 1bbab12d79bec6225ce4d4b019c8971d9a415bf3..5c17e3be99e2f29ff8d48257e51149c747d46119 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2373,7 +2373,7 @@ dependencies = [ [[package]] name = "rustus" -version = "0.4.3" +version = "0.4.4" dependencies = [ "actix-files", "actix-rt", diff --git a/Cargo.toml b/Cargo.toml index 525541321413b0d9cdcbcd8edd73d9c5a5ca4a1d..da7cc4a4846f3f300b0e3579bb78e8103cdd6bdd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rustus" -version = "0.4.3" +version = "0.4.4" edition = "2021" description = "TUS protocol implementation written in Rust." @@ -113,5 +113,5 @@ httptest = "0.15.4" [profile.release] lto = true panic = "abort" -opt-level = "z" +opt-level = 2 codegen-units = 1 diff --git a/src/info_storages/file_info_storage.rs b/src/info_storages/file_info_storage.rs index 08f977bc8238c13678f98bd37ae1958c47f9e0d9..993f3121c0526a341a3cc1d11b2072b5418a0a2f 100644 --- a/src/info_storages/file_info_storage.rs +++ b/src/info_storages/file_info_storage.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use async_trait::async_trait; use log::error; use tokio::fs::{read_to_string, remove_file, DirBuilder, OpenOptions}; -use tokio::io::{AsyncWriteExt, BufWriter}; +use tokio::io::copy; use crate::errors::{RustusError, RustusResult}; use crate::info_storages::{FileInfo, InfoStorage}; @@ -35,7 +35,7 @@ impl InfoStorage for FileInfoStorage { } async fn set_info(&self, file_info: &FileInfo, create: bool) -> RustusResult<()> { - let file = OpenOptions::new() + let mut file = OpenOptions::new() .write(true) .create(create) .truncate(true) @@ -45,27 +45,11 @@ impl InfoStorage for FileInfoStorage { error!("{:?}", err); RustusError::UnableToWrite(err.to_string()) })?; - let mut writer = BufWriter::new(file); - writer - .write( - serde_json::to_string(&file_info) - .map_err(|err| { - error!("{:#?}", err); - err - })? - .as_bytes(), - ) - .await - .map_err(|err| { - error!("{:?}", err); - RustusError::UnableToWrite( - self.info_file_path(file_info.id.as_str()) - .as_path() - .display() - .to_string(), - ) - })?; - writer.flush().await?; + let data = serde_json::to_string(&file_info).map_err(|err| { + error!("{:#?}", err); + err + })?; + copy(&mut data.as_bytes(), &mut file).await?; Ok(()) } diff --git a/src/main.rs b/src/main.rs index 93aacc19b89975f8e51d66314f381374d2c21764..5b5330c6d3dc628e60910afd449a07c49cb6b6cc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ #![cfg_attr(coverage, feature(no_coverage))] + use std::str::FromStr; use std::sync::Arc; diff --git a/src/storages/file_storage.rs b/src/storages/file_storage.rs index 607dbc17b8bb798278b5911b6e2055cbab22b404..a89985a59f893acaa3ea6d93ae72ccbf173b7f1d 100644 --- a/src/storages/file_storage.rs +++ b/src/storages/file_storage.rs @@ -4,7 +4,7 @@ use actix_files::NamedFile; use async_trait::async_trait; use log::error; use tokio::fs::{remove_file, DirBuilder, OpenOptions}; -use tokio::io::{copy, AsyncWriteExt, BufWriter}; +use tokio::io::{copy, BufReader}; use crate::errors::{RustusError, RustusResult}; use crate::info_storages::FileInfo; @@ -85,7 +85,7 @@ impl Storage for FileStorage { // Opening file in w+a mode. // It means that we're going to append some // bytes to the end of a file. - let file = OpenOptions::new() + let mut file = OpenOptions::new() .write(true) .append(true) .create(false) @@ -95,15 +95,8 @@ impl Storage for FileStorage { error!("{:?}", err); RustusError::UnableToWrite(err.to_string()) })?; - let mut writer = BufWriter::new(file); - writer.write(bytes).await.map_err(|err| { - error!("{:?}", err); - RustusError::UnableToWrite(info.path.clone().unwrap()) - })?; - writer.flush().await.map_err(|err| { - error!("{:?}", err); - RustusError::UnableToWrite(info.path.clone().unwrap()) - })?; + let mut reader = BufReader::new(bytes); + copy(&mut reader, &mut file).await?; Ok(()) }