2020-06-24 13:27:40 +00:00
|
|
|
use std::path::PathBuf;
|
2020-07-29 07:38:11 +00:00
|
|
|
|
2020-06-24 13:27:40 +00:00
|
|
|
use anyhow::Error;
|
2020-07-29 07:38:11 +00:00
|
|
|
use futures::stream::TryStreamExt;
|
2020-06-24 13:27:40 +00:00
|
|
|
use hyper::{Body, Response, StatusCode, header};
|
2020-07-29 07:38:11 +00:00
|
|
|
|
|
|
|
use proxmox::http_bail;
|
2020-06-24 13:27:40 +00:00
|
|
|
|
|
|
|
pub async fn create_download_response(path: PathBuf) -> Result<Response<Body>, Error> {
|
2020-07-29 07:38:11 +00:00
|
|
|
let file = match tokio::fs::File::open(path.clone()).await {
|
|
|
|
Ok(file) => file,
|
|
|
|
Err(ref err) if err.kind() == std::io::ErrorKind::NotFound => {
|
|
|
|
http_bail!(NOT_FOUND, "open file {:?} failed - not found", path);
|
|
|
|
}
|
|
|
|
Err(err) => http_bail!(BAD_REQUEST, "open file {:?} failed: {}", path, err),
|
|
|
|
};
|
2020-06-24 13:27:40 +00:00
|
|
|
|
|
|
|
let payload = tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new())
|
2021-01-15 13:38:27 +00:00
|
|
|
.map_ok(|bytes| bytes.freeze());
|
2020-06-24 13:27:40 +00:00
|
|
|
|
|
|
|
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())
|
|
|
|
}
|