http_range_client/
reqwest_client.rs1use crate::error::{HttpError, Result};
2use bytes::Bytes;
3
4#[cfg(feature = "reqwest-async")]
5pub(crate) mod nonblocking {
6 use super::*;
7 use crate::range_client::AsyncHttpRangeClient;
8 use async_trait::async_trait;
9
10 #[cfg(not(target_arch = "wasm32"))]
11 #[async_trait]
12 impl AsyncHttpRangeClient for reqwest::Client {
13 async fn get_range(&self, url: &str, range: &str) -> Result<Bytes> {
14 let response = self.get(url).header("Range", range).send().await?;
15 if !response.status().is_success() {
16 return Err(HttpError::HttpStatus(response.status().as_u16()));
17 }
18 response
19 .bytes()
20 .await
21 .map_err(|e| HttpError::HttpError(e.to_string()))
22 }
23 async fn head_response_header(&self, url: &str, header: &str) -> Result<Option<String>> {
24 let response = self.head(url).send().await?;
25 if let Some(val) = response.headers().get(header) {
26 let v = val
27 .to_str()
28 .map_err(|e| HttpError::HttpError(e.to_string()))?;
29 Ok(Some(v.to_string()))
30 } else {
31 Ok(None)
32 }
33 }
34 }
35
36 #[cfg(target_arch = "wasm32")]
37 #[async_trait(?Send)]
38 impl AsyncHttpRangeClient for reqwest::Client {
39 async fn get_range(&self, url: &str, range: &str) -> Result<Bytes> {
40 let response = self.get(url).header("Range", range).send().await?;
41 if !response.status().is_success() {
42 return Err(HttpError::HttpStatus(response.status().as_u16()));
43 }
44 response
45 .bytes()
46 .await
47 .map_err(|e| HttpError::HttpError(e.to_string()))
48 }
49 async fn head_response_header(&self, url: &str, header: &str) -> Result<Option<String>> {
50 let response = self.head(url).send().await?;
51 if let Some(val) = response.headers().get(header) {
52 let v = val
53 .to_str()
54 .map_err(|e| HttpError::HttpError(e.to_string()))?;
55 Ok(Some(v.to_string()))
56 } else {
57 Ok(None)
58 }
59 }
60 }
61
62 pub type BufferedHttpRangeClient = crate::AsyncBufferedHttpRangeClient<reqwest::Client>;
64
65 impl BufferedHttpRangeClient {
66 pub fn new(url: &str) -> Self {
67 Self::with(reqwest::Client::new(), url)
68 }
69 }
70}
71
72#[cfg(feature = "reqwest-sync")]
73pub(crate) mod sync {
74 use super::*;
75 use crate::range_client::SyncHttpRangeClient;
76
77 impl SyncHttpRangeClient for reqwest::blocking::Client {
78 fn get_range(&self, url: &str, range: &str) -> Result<Bytes> {
79 let response = self.get(url).header("Range", range).send()?;
80 if !response.status().is_success() {
81 return Err(HttpError::HttpStatus(response.status().as_u16()));
82 }
83 response
84 .bytes()
85 .map_err(|e| HttpError::HttpError(e.to_string()))
86 }
87 fn head_response_header(&self, url: &str, header: &str) -> Result<Option<String>> {
88 let response = self.head(url).send()?;
89 if let Some(val) = response.headers().get(header) {
90 let v = val
91 .to_str()
92 .map_err(|e| HttpError::HttpError(e.to_string()))?;
93 Ok(Some(v.to_string()))
94 } else {
95 Ok(None)
96 }
97 }
98 }
99
100 pub type HttpReader = crate::SyncBufferedHttpRangeClient<reqwest::blocking::Client>;
102
103 impl HttpReader {
104 pub fn new(url: &str) -> Self {
105 Self::with(reqwest::blocking::Client::new(), url)
106 }
107 }
108}
109
110impl From<reqwest::Error> for HttpError {
111 fn from(error: reqwest::Error) -> Self {
112 if let Some(status) = error.status() {
113 HttpError::HttpStatus(status.as_u16())
114 } else {
115 HttpError::HttpError(error.to_string())
116 }
117 }
118}