use std::time::Duration;
use crate::{error::HttpError, headers::Headers, prelude::HttpResponse, request::HttpRequest};
use super::{send_request, Proxy};
pub struct HttpClient {
proxy: Proxy,
ssl_verify: bool,
headers: Headers,
connect_timeout: Option<Duration>,
write_timeout: Option<Duration>,
read_timeout: Option<Duration>
}
pub struct ClientBuilder {
proxy: Proxy,
ssl_verify: bool,
headers: Headers,
connect_timeout: Option<Duration>,
write_timeout: Option<Duration>,
read_timeout: Option<Duration>
}
impl ClientBuilder {
pub fn new() -> ClientBuilder {
ClientBuilder {
proxy: Proxy::None,
ssl_verify: true,
headers: Headers::new(),
connect_timeout: None,
write_timeout: None,
read_timeout: None
}
}
pub fn build(self) -> HttpClient {
HttpClient {
proxy: self.proxy,
ssl_verify: self.ssl_verify,
headers: self.headers,
connect_timeout: self.connect_timeout,
write_timeout: self.write_timeout,
read_timeout: self.read_timeout
}
}
pub fn timeout(mut self, connect: Option<Duration>, read: Option<Duration>, write: Option<Duration>) -> Self {
self.connect_timeout = connect;
self.read_timeout = read;
self.write_timeout = write;
self
}
pub fn connect_timeout(mut self, timeout: Duration) -> Self {
self.connect_timeout = Some(timeout);
self
}
pub fn read_timeout(mut self, timeout: Duration) -> Self {
self.read_timeout = Some(timeout);
self
}
pub fn write_timeout(mut self, timeout: Duration) -> Self {
self.write_timeout = Some(timeout);
self
}
pub fn proxy(mut self, proxy: Proxy) -> Self {
self.proxy = proxy;
self
}
pub fn ssl_verify(mut self, verify: bool) -> Self {
self.ssl_verify = verify;
self
}
pub fn headers(mut self, headers: Headers) -> Self {
self.headers = headers;
self
}
pub fn header(mut self, name: impl ToString, value: impl ToString) -> Self {
self.headers.put(name, value.to_string());
self
}
}
impl HttpClient {
pub fn builder() -> ClientBuilder {
ClientBuilder::new()
}
pub async fn send(&self, request: HttpRequest) -> Result<HttpResponse, HttpError> {
send_request(
request,
self.ssl_verify,
self.proxy.clone(),
self.headers.clone(),
self.connect_timeout,
self.write_timeout,
self.read_timeout
).await
}
pub fn connect_timeout(&self) -> Option<Duration> {
self.connect_timeout.clone()
}
pub fn read_timeout(&self) -> Option<Duration> {
self.read_timeout.clone()
}
pub fn write_timeout(&self) -> Option<Duration> {
self.write_timeout.clone()
}
pub fn proxy(&self) -> Proxy {
self.proxy.clone()
}
pub fn ssl_verify(&self) -> bool {
self.ssl_verify
}
pub fn headers(&self) -> Headers {
self.headers.clone()
}
}
impl Default for HttpClient {
fn default() -> Self {
ClientBuilder::new().build()
}
}