use std::ops::Deref; use oauth2::http; #[derive(Clone, Debug)] pub struct HttpAuthClient(reqwest::Client); impl From for HttpAuthClient { fn from(value: reqwest::Client) -> Self { Self(value) } } impl Deref for HttpAuthClient { type Target = reqwest::Client; fn deref(&self) -> &Self::Target { &self.0 } } impl<'c> oauth2::AsyncHttpClient<'c> for HttpAuthClient { type Error = oauth2::HttpClientError; #[cfg(target_arch = "wasm32")] type Future = Pin> + 'c>>; #[cfg(not(target_arch = "wasm32"))] type Future = std::pin::Pin< Box> + Send + Sync + 'c>, >; fn call(&'c self, request: oauth2::HttpRequest) -> Self::Future { Box::pin(async move { let response = self .0 .execute(request.try_into().map_err(Box::new)?) .await .map_err(Box::new)?; let mut builder = http::Response::builder().status(response.status()); #[cfg(not(target_arch = "wasm32"))] { builder = builder.version(response.version()); } for (name, value) in response.headers().iter() { builder = builder.header(name, value); } builder .body(response.bytes().await.map_err(Box::new)?.to_vec()) .map_err(oauth2::HttpClientError::Http) }) } }