stream_download/http/
reqwest_middleware_client.rs

1use std::sync::{Arc, LazyLock};
2
3use parking_lot::Mutex;
4use reqwest::header::HeaderMap;
5use reqwest_middleware::Middleware;
6
7use super::{Client, RANGE_HEADER_KEY, format_range_header_bytes};
8
9static DEFAULT_MIDDLEWARE: LazyLock<Mutex<Vec<Arc<dyn reqwest_middleware::Middleware>>>> =
10    LazyLock::new(|| Mutex::new([].into()));
11
12pub(crate) fn add_default_middleware<M>(middleware: M)
13where
14    M: Middleware,
15{
16    DEFAULT_MIDDLEWARE.lock().push(Arc::new(middleware));
17}
18
19impl Client for reqwest_middleware::ClientWithMiddleware {
20    type Url = reqwest::Url;
21    type Response = reqwest::Response;
22    type Error = reqwest_middleware::Error;
23    type Headers = HeaderMap;
24
25    fn create() -> Self {
26        Self::new(
27            reqwest::Client::create(),
28            DEFAULT_MIDDLEWARE.lock().clone().into_boxed_slice(),
29        )
30    }
31
32    async fn get(&self, url: &Self::Url) -> Result<Self::Response, Self::Error> {
33        self.get(url.clone()).send().await
34    }
35
36    async fn get_range(
37        &self,
38        url: &Self::Url,
39        start: u64,
40        end: Option<u64>,
41    ) -> Result<Self::Response, Self::Error> {
42        self.get(url.clone())
43            .header(RANGE_HEADER_KEY, format_range_header_bytes(start, end))
44            .send()
45            .await
46    }
47}