use async_trait::async_trait;
use reqwest::{Client, Proxy, Url};
use crate::{
enums::content::Content,
interfaces::requester::RequesterInterface,
types::{config::requester::RequesterConfig, core::Result},
};
const CLIENT_BUILD_ERR: &str = "Cannot create HTTP client!";
const PROXY_PARSE_ERR: &str = "Cannot parse proxy!";
#[derive(Default)]
pub struct HTTPClient {
pub config: RequesterConfig,
pub client: Client,
}
impl HTTPClient {
pub fn with_config(config: RequesterConfig) -> Self {
Self {
config,
client: Client::new(),
}
}
}
#[async_trait]
impl RequesterInterface for HTTPClient {
async fn config(&mut self) -> &mut RequesterConfig {
&mut self.config
}
async fn configure(&mut self, config: RequesterConfig) {
let mut builder = Client::builder().default_headers(config.headers.clone());
if let Some(proxy) = &config.proxy {
builder = builder.proxy(Proxy::all(proxy).expect(PROXY_PARSE_ERR));
}
self.config = config;
self.client = builder.build().expect(CLIENT_BUILD_ERR);
}
async fn get_content(&self, url: Url) -> Result<Content> {
let mut builder = self.client.get(url);
builder = builder.timeout(self.config.timeout).headers(self.config.headers.clone());
if self.config.credentials.is_ok() {
let username = self.config.credentials.username.value.clone();
let password = self.config.credentials.password.value.clone();
builder = builder.basic_auth(username.unwrap(), password);
}
let request = builder.build()?;
let response = self.client.execute(request).await?;
Ok(response.text().await?.into())
}
}