|
|
@@ -5,6 +5,7 @@ use std::fmt::{Debug, Formatter};
|
|
|
use std::ops::Deref;
|
|
|
use std::path::Path;
|
|
|
use tokio::fs;
|
|
|
+use url::Url;
|
|
|
|
|
|
use crate::transport::{DEFAULT_KEEPALIVE_INTERVAL, DEFAULT_KEEPALIVE_SECS, DEFAULT_NODELAY};
|
|
|
|
|
|
@@ -20,7 +21,7 @@ impl Debug for MaskedString {
|
|
|
}
|
|
|
|
|
|
impl Deref for MaskedString {
|
|
|
- type Target = String;
|
|
|
+ type Target = str;
|
|
|
fn deref(&self) -> &Self::Target {
|
|
|
&self.0
|
|
|
}
|
|
|
@@ -142,36 +143,38 @@ fn default_keepalive_interval() -> u64 {
|
|
|
DEFAULT_KEEPALIVE_INTERVAL
|
|
|
}
|
|
|
|
|
|
-#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
|
|
|
+#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
|
|
#[serde(deny_unknown_fields)]
|
|
|
-pub struct TransportConfig {
|
|
|
- #[serde(rename = "type")]
|
|
|
- pub transport_type: TransportType,
|
|
|
+pub struct TcpConfig {
|
|
|
#[serde(default = "default_nodelay")]
|
|
|
pub nodelay: bool,
|
|
|
#[serde(default = "default_keepalive_secs")]
|
|
|
pub keepalive_secs: u64,
|
|
|
#[serde(default = "default_keepalive_interval")]
|
|
|
pub keepalive_interval: u64,
|
|
|
- pub tls: Option<TlsConfig>,
|
|
|
- pub noise: Option<NoiseConfig>,
|
|
|
+ pub proxy: Option<Url>,
|
|
|
}
|
|
|
|
|
|
-impl Default for TransportConfig {
|
|
|
- fn default() -> TransportConfig {
|
|
|
- TransportConfig {
|
|
|
- transport_type: Default::default(),
|
|
|
+impl Default for TcpConfig {
|
|
|
+ fn default() -> Self {
|
|
|
+ Self {
|
|
|
nodelay: default_nodelay(),
|
|
|
keepalive_secs: default_keepalive_secs(),
|
|
|
keepalive_interval: default_keepalive_interval(),
|
|
|
- tls: None,
|
|
|
- noise: None,
|
|
|
+ proxy: None,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-fn default_transport() -> TransportConfig {
|
|
|
- Default::default()
|
|
|
+#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)]
|
|
|
+#[serde(deny_unknown_fields)]
|
|
|
+pub struct TransportConfig {
|
|
|
+ #[serde(rename = "type")]
|
|
|
+ pub transport_type: TransportType,
|
|
|
+ #[serde(default)]
|
|
|
+ pub tcp: TcpConfig,
|
|
|
+ pub tls: Option<TlsConfig>,
|
|
|
+ pub noise: Option<NoiseConfig>,
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Serialize, Deserialize, Default, PartialEq, Clone)]
|
|
|
@@ -180,7 +183,7 @@ pub struct ClientConfig {
|
|
|
pub remote_addr: String,
|
|
|
pub default_token: Option<MaskedString>,
|
|
|
pub services: HashMap<String, ClientServiceConfig>,
|
|
|
- #[serde(default = "default_transport")]
|
|
|
+ #[serde(default)]
|
|
|
pub transport: TransportConfig,
|
|
|
}
|
|
|
|
|
|
@@ -190,7 +193,7 @@ pub struct ServerConfig {
|
|
|
pub bind_addr: String,
|
|
|
pub default_token: Option<MaskedString>,
|
|
|
pub services: HashMap<String, ServerServiceConfig>,
|
|
|
- #[serde(default = "default_transport")]
|
|
|
+ #[serde(default)]
|
|
|
pub transport: TransportConfig,
|
|
|
}
|
|
|
|
|
|
@@ -255,6 +258,15 @@ impl Config {
|
|
|
}
|
|
|
|
|
|
fn validate_transport_config(config: &TransportConfig, is_server: bool) -> Result<()> {
|
|
|
+ config
|
|
|
+ .tcp
|
|
|
+ .proxy
|
|
|
+ .as_ref()
|
|
|
+ .map_or(Ok(()), |u| match u.scheme() {
|
|
|
+ "socks5" => Ok(()),
|
|
|
+ "http" => Ok(()),
|
|
|
+ _ => Err(anyhow!(format!("Unknown proxy scheme: {}", u.scheme()))),
|
|
|
+ })?;
|
|
|
match config.transport_type {
|
|
|
TransportType::Tcp => Ok(()),
|
|
|
TransportType::Tls => {
|