use std::{collections::HashMap, time::Duration};
use reqwest::header::{HeaderMap, HeaderName, HeaderValue, USER_AGENT};
use crate::{
cli::commands::{module::run::ModuleRunSubCommandArgs, scan::ScanCommandArgs},
constants::{DEFAULT_HTTP_TIMEOUT, DEFAULT_USER_AGENT},
types::{config::subscan::SubscanConfig, env::Credentials},
};
#[derive(Debug, Clone, PartialEq)]
pub struct RequesterConfig {
pub headers: HeaderMap,
pub timeout: Duration,
pub proxy: Option<String>,
pub credentials: Credentials,
}
impl Default for RequesterConfig {
fn default() -> Self {
Self {
headers: HeaderMap::from_iter([(
USER_AGENT,
HeaderValue::from_static(DEFAULT_USER_AGENT),
)]),
timeout: DEFAULT_HTTP_TIMEOUT,
proxy: None,
credentials: Credentials::default(),
}
}
}
impl From<ModuleRunSubCommandArgs> for RequesterConfig {
fn from(args: ModuleRunSubCommandArgs) -> Self {
Self {
headers: HeaderMap::from_iter([(
USER_AGENT,
HeaderValue::from_str(&args.user_agent).unwrap(),
)]),
timeout: Duration::from_secs(args.http_timeout),
proxy: args.proxy,
..Default::default()
}
}
}
impl From<ScanCommandArgs> for RequesterConfig {
fn from(args: ScanCommandArgs) -> Self {
Self {
headers: HeaderMap::from_iter([(
USER_AGENT,
HeaderValue::from_str(&args.user_agent).unwrap(),
)]),
timeout: Duration::from_secs(args.http_timeout),
proxy: args.proxy,
..Default::default()
}
}
}
impl From<SubscanConfig> for RequesterConfig {
fn from(config: SubscanConfig) -> Self {
config.requester
}
}
impl RequesterConfig {
pub fn headers_as_hashmap(&self) -> HashMap<&str, &str> {
let cast_to_str: for<'a, 'b> fn((&'a HeaderName, &'b HeaderValue)) -> (&'a str, &'b str) =
|item| (item.0.as_str(), item.1.to_str().unwrap());
HashMap::from_iter(self.headers.iter().map(cast_to_str))
}
pub fn add_header(&mut self, name: HeaderName, value: HeaderValue) {
self.headers.insert(name, value);
}
pub fn set_credentials(&mut self, credentials: Credentials) {
self.credentials = credentials;
}
}