use crate::common::types::{Bodies, Headers, QueryParams};
use derive_builder::Builder;
use std::collections::HashMap;
#[derive(Debug, Clone, Builder)]
#[builder(name = "HttpConfigBuilder", pattern = "owned", setter(strip_option))]
pub struct HttpConfig {
#[builder(default = 300)]
timeout_seconds: u64,
#[builder(default = 10)]
connect_timeout_seconds: u64,
#[builder(default = None)]
proxy: Option<String>,
#[builder(default = None)]
user_agent: Option<String>,
#[builder(default = HashMap::new())]
headers: Headers,
#[builder(default = HashMap::new())]
querys: QueryParams,
#[builder(default = HashMap::new())]
bodys: Bodies,
}
impl HttpConfig {
pub fn builder() -> HttpConfigBuilder {
HttpConfigBuilder::default()
}
#[inline]
pub fn timeout_seconds(&self) -> u64 {
self.timeout_seconds
}
#[inline]
pub fn connect_timeout_seconds(&self) -> u64 {
self.connect_timeout_seconds
}
#[inline]
pub fn proxy(&self) -> Option<&String> {
self.proxy.as_ref()
}
#[inline]
pub fn user_agent(&self) -> Option<&String> {
self.user_agent.as_ref()
}
#[inline]
pub fn headers(&self) -> &Headers {
&self.headers
}
#[inline]
pub fn querys(&self) -> &QueryParams {
&self.querys
}
#[inline]
pub fn bodys(&self) -> &Bodies {
&self.bodys
}
#[inline]
pub fn get_body(&self, key: &str) -> Option<&serde_json::Value> {
self.bodys.get(key)
}
#[inline]
pub fn get_header(&self, key: &str) -> Option<&String> {
self.headers.get(key)
}
#[inline]
pub fn get_query(&self, key: &str) -> Option<&String> {
self.querys.get(key)
}
pub fn add_header(&mut self, key: impl Into<String>, value: impl Into<String>) -> &mut Self {
self.headers.insert(key.into(), value.into());
self
}
pub fn remove_header(&mut self, key: &str) -> Option<String> {
self.headers.remove(key)
}
pub fn add_query(&mut self, key: impl Into<String>, value: impl Into<String>) -> &mut Self {
self.querys.insert(key.into(), value.into());
self
}
pub fn remove_query(&mut self, key: &str) -> Option<String> {
self.querys.remove(key)
}
pub fn add_body(
&mut self,
key: impl Into<String>,
value: impl Into<serde_json::Value>,
) -> &mut Self {
self.bodys.insert(key.into(), value.into());
self
}
pub fn remove_body(&mut self, key: &str) -> Option<serde_json::Value> {
self.bodys.remove(key)
}
pub fn with_timeout_seconds(&mut self, timeout_seconds: u64) -> &mut Self {
self.timeout_seconds = timeout_seconds;
self
}
pub fn with_connect_timeout_seconds(&mut self, connect_timeout_seconds: u64) -> &mut Self {
self.connect_timeout_seconds = connect_timeout_seconds;
self
}
pub fn with_proxy(&mut self, proxy: impl Into<String>) -> &mut Self {
self.proxy = Some(proxy.into());
self
}
pub fn with_user_agent(&mut self, user_agent: impl Into<String>) -> &mut Self {
self.user_agent = Some(user_agent.into());
self
}
pub fn build_reqwest_client(&self) -> reqwest::Client {
let mut client_builder = reqwest::ClientBuilder::new()
.timeout(std::time::Duration::from_secs(self.timeout_seconds))
.connect_timeout(std::time::Duration::from_secs(self.connect_timeout_seconds));
if let Some(ref proxy_url) = self.proxy {
if let Ok(proxy) = reqwest::Proxy::all(proxy_url) {
client_builder = client_builder.proxy(proxy);
}
}
if let Some(ref user_agent) = self.user_agent {
client_builder = client_builder.user_agent(user_agent);
}
client_builder
.build()
.unwrap_or_else(|_| reqwest::Client::new())
}
}
impl Default for HttpConfig {
fn default() -> Self {
Self {
timeout_seconds: 300,
connect_timeout_seconds: 10,
proxy: None,
user_agent: None,
headers: HashMap::new(),
querys: HashMap::new(),
bodys: HashMap::new(),
}
}
}
impl HttpConfigBuilder {
pub fn header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
let headers_map = self.headers.get_or_insert_with(HashMap::new);
headers_map.insert(key.into(), value.into());
self
}
pub fn query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
let query_map = self.querys.get_or_insert_with(HashMap::new);
query_map.insert(key.into(), value.into());
self
}
pub fn body(mut self, key: impl Into<String>, value: impl Into<serde_json::Value>) -> Self {
let body_map = self.bodys.get_or_insert_with(HashMap::new);
body_map.insert(key.into(), value.into());
self
}
}