use super::{HttpClient, HttpError, HttpRequest, HttpResponse};
#[derive(Debug, Clone)]
pub struct ReqwestClient {
inner: reqwest::Client,
}
impl ReqwestClient {
#[must_use]
pub fn new() -> Self {
Self {
inner: reqwest::Client::new(),
}
}
#[must_use]
pub const fn from_client(client: reqwest::Client) -> Self {
Self { inner: client }
}
}
impl Default for ReqwestClient {
fn default() -> Self {
Self::new()
}
}
impl HttpClient for ReqwestClient {
async fn request(&self, req: HttpRequest) -> Result<HttpResponse, HttpError> {
let mut builder = self.inner.request(req.method, req.url.as_str());
for (name, value) in &req.headers {
builder = builder.header(name, value);
}
if let Some(body) = req.body {
builder = builder.body(body);
}
let response = builder.send().await.map_err(|e| {
if e.is_timeout() {
HttpError::Timeout
} else if e.is_builder() {
HttpError::InvalidUrl(e.to_string())
} else {
HttpError::Connection(Box::new(e))
}
})?;
let status = response.status();
let headers = response.headers().clone();
let body = response
.bytes()
.await
.map_err(|e| HttpError::Connection(Box::new(e)))?
.to_vec();
Ok(HttpResponse::new(status, headers, body))
}
}