use async_zip::Compression;
use futures::stream::StreamExt;
use futures::TryStreamExt;
-use hyper::body::Bytes;
use hyper::header::HeaderValue;
use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Method, StatusCode};
use std::sync::Arc;
use std::time::SystemTime;
use tokio::fs::File;
-use tokio::io::{AsyncReadExt, AsyncWrite};
+use tokio::io::AsyncWrite;
use tokio::{fs, io};
use tokio_util::codec::{BytesCodec, FramedRead};
-use tokio_util::io::StreamReader;
+use tokio_util::io::{ReaderStream, StreamReader};
type Request = hyper::Request<Body>;
type Response = hyper::Response<Body>;
}
async fn handle_send_dir_zip(&self, path: &Path) -> BoxResult<Response> {
- let (mut tx, body) = Body::channel();
- let (mut writer, mut reader) = tokio::io::duplex(BUF_SIZE);
+ let (mut writer, reader) = tokio::io::duplex(BUF_SIZE);
let path = path.to_owned();
tokio::spawn(async move {
if let Err(e) = dir_zip(&mut writer, &path).await {
error!("Fail to zip {}, {}", path.display(), e.to_string());
}
});
- tokio::spawn(async move {
- // Reuse this buffer
- let mut buf = [0_u8; BUF_SIZE];
- loop {
- let n = reader.read(&mut buf).await.unwrap();
- if n == 0 {
- break;
- }
- if (tx.send_data(Bytes::from(buf[..n].to_vec())).await).is_err() {
- break;
- }
- }
- });
+ let stream = ReaderStream::new(reader);
+ let body = Body::wrap_stream(stream);
Ok(Response::new(body))
}