use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::anomaly::PayloadAnomalyType;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PayloadConfig {
pub enabled: bool,
pub window_duration_ms: u64,
pub max_windows: usize,
pub max_endpoints: usize,
pub max_entities: usize,
pub oversize_threshold: f64,
pub bandwidth_spike_threshold: f64,
pub warmup_requests: u32,
pub exfiltration_ratio_threshold: f64,
pub upload_ratio_threshold: f64,
pub min_large_payload_bytes: u64,
pub timeline_max_buckets: usize,
pub anomaly_risk: HashMap<PayloadAnomalyType, f64>,
}
impl Default for PayloadConfig {
fn default() -> Self {
let mut anomaly_risk = HashMap::new();
anomaly_risk.insert(PayloadAnomalyType::OversizedRequest, 20.0);
anomaly_risk.insert(PayloadAnomalyType::OversizedResponse, 15.0);
anomaly_risk.insert(PayloadAnomalyType::BandwidthSpike, 25.0);
anomaly_risk.insert(PayloadAnomalyType::ExfiltrationPattern, 40.0);
anomaly_risk.insert(PayloadAnomalyType::UploadPattern, 35.0);
Self {
enabled: true,
window_duration_ms: 60_000,
max_windows: 60,
max_endpoints: 5_000,
max_entities: 10_000,
oversize_threshold: 3.0,
bandwidth_spike_threshold: 5.0,
warmup_requests: 100,
exfiltration_ratio_threshold: 100.0,
upload_ratio_threshold: 100.0,
min_large_payload_bytes: 100_000,
timeline_max_buckets: 1_440,
anomaly_risk,
}
}
}