use ipnetwork::IpNetwork;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProxyConfig {
pub session_timeout: Duration,
pub max_sessions: usize,
pub request_timeout: Duration,
}
impl Default for ProxyConfig {
fn default() -> Self {
Self {
session_timeout: Duration::from_secs(300),
max_sessions: 1000,
request_timeout: Duration::from_secs(30),
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)]
pub enum IdMappingStrategy {
#[default]
Prefix,
MappingTable,
PassThrough,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum BackendConfig {
Stdio {
command: String,
args: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
working_dir: Option<String>,
},
Http {
url: String,
#[serde(skip_serializing_if = "Option::is_none")]
auth_token: Option<String>,
},
Tcp {
host: String,
port: u16,
},
#[cfg(unix)]
Unix {
path: String,
},
WebSocket {
url: String,
},
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum FrontendType {
Stdio,
Http,
WebSocket,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
#[serde(rename_all = "lowercase")]
pub enum SsrfProtection {
#[default]
Strict,
Balanced {
allowed_private_networks: Vec<IpNetwork>,
},
Disabled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BackendValidationConfig {
pub ssrf_protection: SsrfProtection,
pub allowed_schemes: Vec<String>,
pub blocked_hosts: Vec<String>,
}
impl Default for BackendValidationConfig {
fn default() -> Self {
Self {
ssrf_protection: SsrfProtection::Strict,
allowed_schemes: vec![
"http".to_string(),
"https".to_string(),
"ws".to_string(),
"wss".to_string(),
],
blocked_hosts: vec![],
}
}
}