feat: WSS transport mode selector in Flutter UI + TransportConfig in Rust

This commit is contained in:
ospab 2026-05-21 00:39:12 +03:00
parent 0cc5cf47ef
commit 9329bcef45
2 changed files with 41 additions and 1 deletions

View File

@ -14,6 +14,8 @@ pub struct ClientConfig {
pub local_proxy: LocalProxyConfig, pub local_proxy: LocalProxyConfig,
pub turn: TurnConfig, pub turn: TurnConfig,
#[serde(default)] #[serde(default)]
pub transport: TransportConfig,
#[serde(default)]
pub exclusions: ExclusionConfig, pub exclusions: ExclusionConfig,
#[serde(default)] #[serde(default)]
pub multiplex: MultiplexConfig, pub multiplex: MultiplexConfig,
@ -52,8 +54,40 @@ pub struct LocalProxyConfig {
pub connect_timeout_ms: u64, pub connect_timeout_ms: u64,
} }
/// Transport layer configuration.
/// `mode` = "udp" (default) or "wss" (WebSocket Secure — bypasses DPI whitelists).
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Default)] pub struct TransportConfig {
/// "udp" or "wss"
#[serde(default = "default_transport_mode")]
pub mode: String,
/// WebSocket host (domain for TLS connect and HTTP Host header)
#[serde(default)]
pub wss_host: String,
/// WebSocket HTTP path, e.g. "/ostp"
#[serde(default = "default_wss_path")]
pub wss_path: String,
/// TLS SNI override; defaults to wss_host if empty
#[serde(default)]
pub wss_sni: String,
}
fn default_transport_mode() -> String { "udp".to_string() }
fn default_wss_path() -> String { "/ostp".to_string() }
impl Default for TransportConfig {
fn default() -> Self {
Self {
mode: default_transport_mode(),
wss_host: String::new(),
wss_path: default_wss_path(),
wss_sni: String::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TurnConfig { pub struct TurnConfig {
pub enabled: bool, pub enabled: bool,
pub server_addr: String, pub server_addr: String,
@ -61,6 +95,7 @@ pub struct TurnConfig {
pub access_key: String, pub access_key: String,
} }
impl Default for OstpConfig { impl Default for OstpConfig {
fn default() -> Self { fn default() -> Self {
Self { Self {
@ -91,6 +126,7 @@ impl Default for ClientConfig {
ostp: OstpConfig::default(), ostp: OstpConfig::default(),
local_proxy: LocalProxyConfig::default(), local_proxy: LocalProxyConfig::default(),
turn: TurnConfig::default(), turn: TurnConfig::default(),
transport: TransportConfig::default(),
exclusions: ExclusionConfig::default(), exclusions: ExclusionConfig::default(),
multiplex: MultiplexConfig::default(), multiplex: MultiplexConfig::default(),
dns_server: None, dns_server: None,
@ -210,7 +246,9 @@ impl ClientConfig {
enabled: mux.enabled.unwrap_or(false), enabled: mux.enabled.unwrap_or(false),
sessions: mux.sessions.unwrap_or(1), sessions: mux.sessions.unwrap_or(1),
}, },
transport: TransportConfig::default(),
dns_server: raw.tun.as_ref().and_then(|t| t.dns.clone()), dns_server: raw.tun.as_ref().and_then(|t| t.dns.clone()),
}) })
} }
} }

View File

@ -647,8 +647,10 @@ async fn run_client_directly(client_cfg: ClientConfig) -> Result<()> {
enabled: client_cfg.mux.as_ref().and_then(|m| m.enabled).unwrap_or(false), enabled: client_cfg.mux.as_ref().and_then(|m| m.enabled).unwrap_or(false),
sessions: client_cfg.mux.as_ref().and_then(|m| m.sessions).unwrap_or(1), sessions: client_cfg.mux.as_ref().and_then(|m| m.sessions).unwrap_or(1),
}, },
transport: ostp_client::config::TransportConfig::default(),
dns_server: client_cfg.tun.as_ref().and_then(|t| t.dns.clone()), dns_server: client_cfg.tun.as_ref().and_then(|t| t.dns.clone()),
}; };
// Run the client implementation // Run the client implementation
ostp_client::runner::run_client(client_conf).await?; ostp_client::runner::run_client(client_conf).await?;
Ok(()) Ok(())