oauth2/
reqwest_client.rs

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}