use futures::TryStreamExt;
use reqwest::header::HeaderMap;
use std::time::Duration;
use tokio::io::AsyncRead;
use tokio_util::compat::FuturesAsyncReadCompatExt;
pub struct Request {
pub url: String,
pub header: HeaderMap,
pub timeout: Option<Duration>,
}
pub struct Response<R: AsyncRead> {
pub header: HeaderMap,
pub status_code: reqwest::StatusCode,
pub reader: R,
}
pub struct HTTP {}
impl HTTP {
pub async fn get(&self, req: Request) -> super::Result<Response<impl AsyncRead>> {
let mut request_builder = reqwest::Client::new().get(&req.url).headers(req.header);
if let Some(timeout) = req.timeout {
request_builder = request_builder.timeout(timeout);
}
let response = request_builder.send().await?;
let header = response.headers().clone();
let status_code = response.status();
let reader = response
.bytes_stream()
.map_err(|e| futures::io::Error::new(futures::io::ErrorKind::Other, e))
.into_async_read()
.compat();
Ok(Response {
header,
status_code,
reader,
})
}
}