diff --git a/src/api2.rs b/src/api2.rs index 1e5bc4a9..178f3f45 100644 --- a/src/api2.rs +++ b/src/api2.rs @@ -9,6 +9,7 @@ pub mod status; pub mod types; pub mod version; pub mod pull; +mod helpers; use proxmox::api::router::SubdirMap; use proxmox::api::Router; diff --git a/src/api2/helpers.rs b/src/api2/helpers.rs new file mode 100644 index 00000000..9dd4ecba --- /dev/null +++ b/src/api2/helpers.rs @@ -0,0 +1,23 @@ +use std::path::PathBuf; +use anyhow::Error; +use futures::*; +use hyper::{Body, Response, StatusCode, header}; +use proxmox::http_err; + +pub async fn create_download_response(path: PathBuf) -> Result, Error> { + let file = tokio::fs::File::open(path.clone()) + .map_err(move |err| http_err!(BAD_REQUEST, format!("open file {:?} failed: {}", path.clone(), err))) + .await?; + + let payload = tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new()) + .map_ok(|bytes| hyper::body::Bytes::from(bytes.freeze())); + + let body = Body::wrap_stream(payload); + + // fixme: set other headers ? + Ok(Response::builder() + .status(StatusCode::OK) + .header(header::CONTENT_TYPE, "application/octet-stream") + .body(body) + .unwrap()) +} diff --git a/src/api2/reader.rs b/src/api2/reader.rs index a6aed505..4c14c97c 100644 --- a/src/api2/reader.rs +++ b/src/api2/reader.rs @@ -17,6 +17,7 @@ use crate::server::{WorkerTask, H2Service}; use crate::tools; use crate::config::acl::PRIV_DATASTORE_READ; use crate::config::cached_user_info::CachedUserInfo; +use crate::api2::helpers; mod environment; use environment::*; @@ -187,26 +188,9 @@ fn download_file( path.push(env.backup_dir.relative_path()); path.push(&file_name); - let path2 = path.clone(); - let path3 = path.clone(); + env.log(format!("download {:?}", path.clone())); - let file = tokio::fs::File::open(path) - .map_err(move |err| http_err!(BAD_REQUEST, format!("open file {:?} failed: {}", path2, err))) - .await?; - - env.log(format!("download {:?}", path3)); - - let payload = tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new()) - .map_ok(|bytes| hyper::body::Bytes::from(bytes.freeze())); - - let body = Body::wrap_stream(payload); - - // fixme: set other headers ? - Ok(Response::builder() - .status(StatusCode::OK) - .header(header::CONTENT_TYPE, "application/octet-stream") - .body(body) - .unwrap()) + helpers::create_download_response(path).await }.boxed() }