use crate::payload::{PayloadBuilder, PayloadInfo};
use std::{
collections::HashMap,
net::{IpAddr, Ipv4Addr},
time::Duration,
};
#[derive(Clone, Debug)]
pub struct ProbeSetting {
pub ip_addr: IpAddr,
pub hostname: String,
pub ports: Vec<u16>,
pub connect_timeout: Duration,
pub read_timeout: Duration,
pub accept_invalid_certs: bool,
pub payload_map: HashMap<u16, PayloadInfo>,
pub concurrent_limit: usize,
}
impl ProbeSetting {
pub fn new() -> ProbeSetting {
ProbeSetting {
ip_addr: IpAddr::V4(Ipv4Addr::LOCALHOST),
hostname: String::new(),
ports: vec![],
connect_timeout: Duration::from_millis(200),
read_timeout: Duration::from_secs(5),
accept_invalid_certs: false,
payload_map: HashMap::new(),
concurrent_limit: 10,
}
}
pub fn default(ip_addr: IpAddr, hostname: String, ports: Vec<u16>) -> ProbeSetting {
let mut payload_map: HashMap<u16, PayloadInfo> = HashMap::new();
let http_head = PayloadBuilder::http_head();
let https_head = PayloadBuilder::https_head(hostname.clone());
payload_map.insert(80, http_head.clone());
payload_map.insert(443, https_head.clone());
payload_map.insert(8080, http_head);
payload_map.insert(8443, https_head);
ProbeSetting {
ip_addr: ip_addr,
hostname: hostname,
ports: ports,
connect_timeout: Duration::from_secs(1),
read_timeout: Duration::from_secs(5),
accept_invalid_certs: false,
payload_map: payload_map,
concurrent_limit: 10,
}
}
pub fn with_ip_addr(&mut self, ip_addr: IpAddr) -> &mut Self {
self.ip_addr = ip_addr;
self
}
pub fn with_hostname(&mut self, hostname: String) -> &mut Self {
self.hostname = hostname;
if self.ip_addr == IpAddr::V4(Ipv4Addr::LOCALHOST) {
match dns_lookup::lookup_host(&self.hostname) {
Ok(ips) => {
if ips.len() > 0 {
self.ip_addr = ips.first().unwrap().clone();
}
}
Err(_) => {}
}
}
self
}
pub fn add_port(&mut self, port: u16) {
self.ports.push(port);
}
pub fn set_connect_timeout_millis(&mut self, connect_timeout_millis: u64) {
self.connect_timeout = Duration::from_millis(connect_timeout_millis);
}
pub fn set_read_timeout_millis(&mut self, read_timeout_millis: u64) {
self.read_timeout = Duration::from_millis(read_timeout_millis);
}
}
pub struct NoCertificateVerification {}
impl rustls::client::ServerCertVerifier for NoCertificateVerification {
fn verify_server_cert(
&self,
_end_entity: &rustls::Certificate,
_intermediates: &[rustls::Certificate],
_server_name: &rustls::ServerName,
_scts: &mut dyn Iterator<Item = &[u8]>,
_ocsp: &[u8],
_now: std::time::SystemTime,
) -> Result<rustls::client::ServerCertVerified, rustls::Error> {
Ok(rustls::client::ServerCertVerified::assertion())
}
}