#[cfg(feature = "multi")]
use parking_lot::Mutex;
use reqwest::header::{CONNECTION, COOKIE, USER_AGENT};
use reqwest::{Client, IntoUrl, RequestBuilder};
use std::time::Duration;
pub(crate) enum ReqType<U: IntoUrl> {
Post(U),
Get(U),
}
pub struct WebRegWrapperData {
#[cfg(feature = "multi")]
pub(crate) cookies: Mutex<String>,
#[cfg(not(feature = "multi"))]
pub(crate) cookies: String,
pub(crate) client: Client,
pub(crate) user_agent: String,
pub(crate) timeout: Duration,
pub(crate) close_after_request: bool,
}
impl<'a> ReqwestWebRegClientData<'a> for WebRegWrapperData {
#[cfg(feature = "multi")]
fn get_cookies(&'a self) -> String {
self.cookies.lock().to_owned()
}
#[cfg(not(feature = "multi"))]
fn get_cookies(&'a self) -> &'a str {
self.cookies.as_str()
}
fn get_client(&'a self) -> &'a Client {
&self.client
}
fn get_user_agent(&'a self) -> &'a str {
self.user_agent.as_str()
}
fn get_timeout(&'a self) -> Duration {
self.timeout
}
fn close_after_request(&'a self) -> bool {
self.close_after_request
}
}
pub(crate) struct WebRegWrapperDataRef<'a> {
#[cfg(feature = "multi")]
pub cookies: String,
#[cfg(not(feature = "multi"))]
pub cookies: &'a str,
pub client: &'a Client,
pub user_agent: &'a str,
pub timeout: Duration,
pub close_after_request: bool,
}
impl<'a> ReqwestWebRegClientData<'a> for WebRegWrapperDataRef<'a> {
#[cfg(feature = "multi")]
fn get_cookies(&'a self) -> String {
self.cookies.to_owned()
}
#[cfg(not(feature = "multi"))]
fn get_cookies(&'a self) -> &'a str {
self.cookies
}
fn get_client(&'a self) -> &'a Client {
self.client
}
fn get_user_agent(&'a self) -> &'a str {
self.user_agent
}
fn get_timeout(&'a self) -> Duration {
self.timeout
}
fn close_after_request(&'a self) -> bool {
self.close_after_request
}
}
pub(crate) trait ReqwestWebRegClientData<'a> {
#[cfg(not(feature = "multi"))]
fn get_cookies(&'a self) -> &'a str;
#[cfg(feature = "multi")]
fn get_cookies(&'a self) -> String;
fn get_client(&'a self) -> &'a Client;
fn get_user_agent(&'a self) -> &'a str;
fn get_timeout(&'a self) -> Duration;
fn close_after_request(&'a self) -> bool;
fn req<U>(&'a self, req_type: ReqType<U>) -> RequestBuilder
where
U: IntoUrl,
{
let client = self.get_client();
let mut req = match req_type {
ReqType::Post(u) => client.post(u),
ReqType::Get(u) => client.get(u),
}
.header(COOKIE, self.get_cookies())
.header(USER_AGENT, self.get_user_agent())
.timeout(self.get_timeout());
if self.close_after_request() {
req = req.header(CONNECTION, "close");
}
req
}
}