use dashmap::DashMap; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::sync::Arc; use std::sync::atomic::AtomicUsize; pub type UpstreamsDashMap = DashMap, DashMap, (Vec>, AtomicUsize)>>; pub type UpstreamsIdMap = DashMap>; pub type Headers = DashMap, DashMap, Vec<(String, Arc)>>>; #[derive(Clone, Debug, Default, Serialize)] pub struct Extraparams { pub sticky_sessions: u64, pub rate_limit: isize, pub x4xx_limit: u32, pub to_https: bool, pub ssl_verify: bool, pub authentication: Option>, } #[derive(Debug, Default, Clone, Serialize, Deserialize)] pub struct GlobalServiceMapping { pub redirect_to: Option, pub authorization: Option, pub upstream: String, pub hostname: String, pub path: Option, pub to_https: Option, pub rate_limit: Option, pub x4xx_limit: Option, pub client_headers: Option>, pub server_headers: Option>, } #[derive(Clone, Default, Debug, Serialize, Deserialize)] pub struct Kubernetes { pub servers: Option>, pub tokenpath: Option, } #[derive(Clone, Default, Debug, Serialize, Deserialize)] pub struct Consul { pub servers: Option>, pub token: Option, } #[derive(Debug, Default, Serialize, Deserialize)] pub struct Config { pub provider: String, pub to_https: Option, pub sticky_sessions: Option, #[serde(default)] pub upstreams: Option>, #[serde(default)] pub globals: Option>>, #[serde(default)] pub client_headers: Option>, #[serde(default)] pub server_headers: Option>, #[serde(default)] pub authorization: Option, #[serde(default)] pub consul: Option, #[serde(default)] pub kubernetes: Option, #[serde(default)] pub rate_limit: Option, pub x4xx_limit: Option, } #[derive(Debug, Default, Serialize, Deserialize)] pub struct HostConfig { pub paths: HashMap, pub rate_limit: Option, pub x4xx_limit: Option, } #[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct Auth { #[serde(rename = "type")] pub auth_type: String, #[serde(rename = "data")] pub auth_cred: Option, } #[derive(Debug, Default, Serialize, Deserialize)] pub struct PathConfig { pub servers: Vec, pub to_https: Option, pub client_headers: Option>, pub server_headers: Option>, pub rate_limit: Option, pub x4xx_limit: Option, pub healthcheck: Option, pub redirect_to: Option, pub authorization: Option, pub is_ssl: Option, pub is_http2: Option, } #[derive(Debug, Default)] pub struct Configuration { pub upstreams: UpstreamsDashMap, pub client_headers: Headers, pub server_headers: Headers, pub consul: Option, pub kubernetes: Option, pub typecfg: String, pub extraparams: Extraparams, } #[derive(Debug, Default, Serialize, Deserialize)] pub struct AppConfig { pub hc_interval: u16, pub hc_method: String, pub upstreams_conf: String, pub log_level: String, pub cache_enabled: Option, pub cache_storage: Option, pub cache_size_mb: Option, pub cache_ttl: Option, pub access_log: Option, pub pid_file: Option, pub master_key: Option, pub config_address: String, pub proxy_address_http: String, pub config_api_enabled: bool, pub config_tls_address: Option, pub config_tls_certificate: Option, pub config_tls_key_file: Option, pub proxy_address_tls: Option, pub proxy_port_tls: Option, pub proxy_port: Option, pub local_server: Option<(String, u16)>, pub proxy_configs: Option, pub proxy_tls_grade: Option, pub file_server_address: Option, pub file_server_folder: Option, pub runuser: Option, pub rungroup: Option, pub log_file: Option, pub log_pattern: Option, pub log_structured: Option, pub acme_dns_provider: Option, pub tcp_keepalive_idle: Option, pub tcp_keepalive_interval: Option, pub tcp_keepalive_count: Option, pub cluster_member: Option, pub worker_nodes: Option, } #[derive(Debug, Default, Clone, PartialEq, Eq, Hash, Serialize)] pub struct InnerAuth { pub auth_type: Arc, pub auth_cred: Arc, } #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct InnerMap { pub address: Arc, pub port: u16, pub is_ssl: bool, pub is_http2: bool, pub to_https: bool, pub rate_limit: isize, pub x4xx_limit: u32, pub healthcheck: bool, pub redirect_to: Option>, pub authorization: Option>, } #[allow(dead_code)] impl Default for InnerMap { fn default() -> Self { Self::new() } } #[allow(dead_code)] impl InnerMap { pub fn new() -> Self { Self { address: Arc::from("127.0.0.1"), port: Default::default(), is_ssl: Default::default(), is_http2: Default::default(), to_https: Default::default(), rate_limit: Default::default(), x4xx_limit: Default::default(), healthcheck: Default::default(), redirect_to: Default::default(), authorization: Default::default(), } } } #[derive(Debug, Default, Serialize, Deserialize)] pub struct InnerMapForJson { pub address: String, pub port: u16, pub is_ssl: bool, pub is_http2: bool, pub to_https: bool, pub rate_limit: isize, pub x4xx_limit: u32, pub healthcheck: bool, } #[derive(Debug, Default, Serialize, Deserialize)] pub struct UpstreamSnapshotForJson { pub backends: Vec, pub requests: usize, } #[derive(Debug)] pub struct WorkerNodes { pub address: Arc, pub key: Option>, pub port: u16, pub tls: bool, }