stream_download/http/
reqwest_middleware_client.rs1use 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}