1use crate::{AsyncHttpClient, HttpClientError, HttpRequest, HttpResponse};
2
3use std::future::Future;
4use std::pin::Pin;
5
6impl<'c> AsyncHttpClient<'c> for reqwest::Client {
7 type Error = HttpClientError<reqwest::Error>;
8
9 #[cfg(target_arch = "wasm32")]
10 type Future = Pin<Box<dyn Future<Output = Result<HttpResponse, Self::Error>> + 'c>>;
11 #[cfg(not(target_arch = "wasm32"))]
12 type Future =
13 Pin<Box<dyn Future<Output = Result<HttpResponse, Self::Error>> + Send + Sync + 'c>>;
14
15 fn call(&'c self, request: HttpRequest) -> Self::Future {
16 Box::pin(async move {
17 let response = self
18 .execute(request.try_into().map_err(Box::new)?)
19 .await
20 .map_err(Box::new)?;
21
22 let mut builder = http::Response::builder().status(response.status());
23
24 #[cfg(not(target_arch = "wasm32"))]
25 {
26 builder = builder.version(response.version());
27 }
28
29 for (name, value) in response.headers().iter() {
30 builder = builder.header(name, value);
31 }
32
33 builder
34 .body(response.bytes().await.map_err(Box::new)?.to_vec())
35 .map_err(HttpClientError::Http)
36 })
37 }
38}
39
40#[cfg(all(feature = "reqwest-blocking", not(target_arch = "wasm32")))]
41impl crate::SyncHttpClient for reqwest::blocking::Client {
42 type Error = HttpClientError<reqwest::Error>;
43
44 fn call(&self, request: HttpRequest) -> Result<HttpResponse, Self::Error> {
45 let mut response = self
46 .execute(request.try_into().map_err(Box::new)?)
47 .map_err(Box::new)?;
48
49 let mut builder = http::Response::builder()
50 .status(response.status())
51 .version(response.version());
52
53 for (name, value) in response.headers().iter() {
54 builder = builder.header(name, value);
55 }
56
57 let mut body = Vec::new();
58 <reqwest::blocking::Response as std::io::Read>::read_to_end(&mut response, &mut body)?;
59
60 builder.body(body).map_err(HttpClientError::Http)
61 }
62}