-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Revert "Remove Empty in in/outbound"
Some fixes. This reverts commit ec78444.
- Loading branch information
Showing
8 changed files
with
252 additions
and
142 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,9 +18,7 @@ impl SettingsBuilder { | |
/// | ||
/// # Errors | ||
/// Return an error if `url` does not match the above format. | ||
pub fn parse_url( | ||
url: &url::Url, | ||
) -> Result<(Option<Tag>, Self, Option<TransportBuilder>), BoxStdErr> { | ||
pub fn parse_url(url: &url::Url) -> Result<(Option<Tag>, Self, TransportBuilder), BoxStdErr> { | ||
#[cfg(feature = "parse-url-v2rayn")] | ||
{ | ||
if let Ok(result) = parse_url_v2rayn(url) { | ||
|
@@ -33,7 +31,7 @@ impl SettingsBuilder { | |
|
||
/// Parse a URL with the format stated in | ||
/// <https://github.com/v2fly/v2fly-github-io/issues/26> | ||
fn parse_url_std(url: &url::Url) -> Result<(SettingsBuilder, Option<TransportBuilder>), BoxStdErr> { | ||
fn parse_url_std(url: &url::Url) -> Result<(SettingsBuilder, TransportBuilder), BoxStdErr> { | ||
use crate::transport; | ||
|
||
#[cfg(any(feature = "ws-transport-openssl", feature = "ws-transport-rustls"))] | ||
|
@@ -59,17 +57,17 @@ fn parse_url_std(url: &url::Url) -> Result<(SettingsBuilder, Option<TransportBui | |
|
||
crate::utils::url::check_scheme(url, PROTOCOL_NAME)?; | ||
let transport_str = url.username(); | ||
let transport: Option<TransportBuilder> = match transport_str { | ||
"tcp" => None, | ||
let transport: transport::outbound::Builder = match transport_str { | ||
"tcp" => transport::outbound::Builder::default(), | ||
#[cfg(any(feature = "tls-transport-openssl", feature = "tls-transport-rustls"))] | ||
"tls" => Some(transport::tls::OutboundBuilder::default().into()), | ||
"tls" => transport::tls::OutboundBuilder::default().into(), | ||
#[cfg(any(feature = "ws-transport-openssl", feature = "ws-transport-rustls"))] | ||
"ws" => Some(make_ws_builder(url).into()), | ||
"ws" => make_ws_builder(url).into(), | ||
#[cfg(any(feature = "ws-transport-openssl", feature = "ws-transport-rustls"))] | ||
"ws+tls" => { | ||
let mut builder = make_ws_builder(url); | ||
builder.tls = Some(transport::tls::OutboundBuilder::default()); | ||
Some(builder.into()) | ||
builder.into() | ||
} | ||
_ => return Err(format!("invalid transport string '{}'", transport_str).into()), | ||
}; | ||
|
@@ -122,7 +120,7 @@ mod tests { | |
id: "2e09f64c-c967-4ce3-9498-fdcd8e39e04e".parse().unwrap(), | ||
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, None), | ||
}, Default::default()), | ||
), | ||
( | ||
"vmess://ws+tls:[email protected]:12345\ | ||
|
@@ -134,15 +132,15 @@ mod tests { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(transport::outbound::Builder::Ws(transport::ws::OutboundBuilder { | ||
transport::outbound::Builder::Ws(transport::ws::OutboundBuilder { | ||
headers: Default::default(), | ||
path: "/myServerAddressPath/中文路径/".into(), | ||
host: "www.myServer.com".into(), | ||
tls: Some(transport::tls::OutboundBuilder { | ||
alpns: Vec::new(), | ||
ca_file: None, | ||
}), | ||
})), | ||
}), | ||
), | ||
), | ||
]; | ||
|
@@ -225,7 +223,7 @@ mod parse_v2rayn_impl { | |
/// . | ||
pub(super) fn parse_url_v2rayn( | ||
url: &Url, | ||
) -> Result<(Option<Tag>, SettingsBuilder, Option<TransportBuilder>), BoxStdErr> { | ||
) -> Result<(Option<Tag>, SettingsBuilder, TransportBuilder), BoxStdErr> { | ||
if !(url.username().is_empty() && url.password().is_none()) { | ||
return Err("v2rayn format URL should not have username and password".into()); | ||
} | ||
|
@@ -257,7 +255,7 @@ mod parse_v2rayn_impl { | |
sec: obj.scy, | ||
use_legacy_header: false, | ||
}; | ||
let transport: Option<TransportBuilder> = { | ||
let transport = { | ||
#[cfg(any(feature = "tls-transport-openssl", feature = "tls-transport-rustls"))] | ||
{ | ||
let tls_transport = match obj.tls.as_str() { | ||
|
@@ -273,26 +271,22 @@ mod parse_v2rayn_impl { | |
_ => return Err("invalid tls value, can only be 'tls' or empty".into()), | ||
}; | ||
match obj.net { | ||
Net::Tcp => tls_transport.map(Into::into), | ||
Net::Tcp => tls_transport.map_or_else(TransportBuilder::default, Into::into), | ||
#[cfg(any(feature = "ws-transport-openssl", feature = "ws-transport-rustls"))] | ||
Net::Ws => Some( | ||
transport::ws::OutboundBuilder { | ||
headers: Default::default(), | ||
path: obj.path, | ||
host: obj.host, | ||
tls: tls_transport, | ||
} | ||
.into(), | ||
), | ||
Net::Ws => transport::ws::OutboundBuilder { | ||
headers: Default::default(), | ||
path: obj.path, | ||
host: obj.host, | ||
tls: tls_transport, | ||
} | ||
.into(), | ||
#[cfg(any(feature = "h2-transport-openssl", feature = "h2-transport-rustls"))] | ||
Net::Http | Net::H2 => Some( | ||
transport::h2::OutboundBuilder { | ||
host: obj.host, | ||
path: obj.path, | ||
tls: tls_transport, | ||
} | ||
.into(), | ||
), | ||
Net::Http | Net::H2 => transport::h2::OutboundBuilder { | ||
host: obj.host, | ||
path: obj.path, | ||
tls: tls_transport, | ||
} | ||
.into(), | ||
_ => return Err("net not supported".into()), | ||
} | ||
} | ||
|
@@ -301,7 +295,7 @@ mod parse_v2rayn_impl { | |
if !obj.tls.is_empty() { | ||
return Err("TLS not supported".into()); | ||
} | ||
None | ||
TransportBuilder::default() | ||
} | ||
}; | ||
Ok((ps, settings, transport)) | ||
|
@@ -345,14 +339,14 @@ mod parse_v2rayn_impl { | |
input: &str, | ||
expected_tag: impl Into<Tag>, | ||
expected_settings: &SettingsBuilder, | ||
expected_transport: Option<TransportBuilder>, | ||
expected_transport: &TransportBuilder, | ||
) { | ||
let input = Url::from_str(input).unwrap(); | ||
let expected_tag = Some(expected_tag.into()); | ||
let (tag, settings, transport) = parse_url_v2rayn(&input).unwrap(); | ||
assert_eq!(&tag, &expected_tag); | ||
assert_eq!(&settings, expected_settings); | ||
assert_eq!(transport, expected_transport); | ||
assert_eq!(&transport, expected_transport); | ||
} | ||
|
||
#[test] | ||
|
@@ -369,7 +363,7 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
None, | ||
&TransportBuilder::default(), | ||
); | ||
} | ||
|
||
|
@@ -388,9 +382,7 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::Tls( | ||
transport::tls::OutboundBuilder::default(), | ||
)), | ||
&TransportBuilder::Tls(transport::tls::OutboundBuilder::default()), | ||
); | ||
} | ||
|
||
|
@@ -410,12 +402,12 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::Ws(transport::ws::OutboundBuilder { | ||
&TransportBuilder::Ws(transport::ws::OutboundBuilder { | ||
headers: Default::default(), | ||
path: "/testpath".into(), | ||
host: "test.host".into(), | ||
tls: None, | ||
})), | ||
}), | ||
); | ||
// Without host and path | ||
check_v2rayn( | ||
|
@@ -430,12 +422,12 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::Ws(transport::ws::OutboundBuilder { | ||
&TransportBuilder::Ws(transport::ws::OutboundBuilder { | ||
headers: Default::default(), | ||
path: Default::default(), | ||
host: Default::default(), | ||
tls: None, | ||
})), | ||
}), | ||
); | ||
} | ||
|
||
|
@@ -455,12 +447,12 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::Ws(transport::ws::OutboundBuilder { | ||
&TransportBuilder::Ws(transport::ws::OutboundBuilder { | ||
headers: Default::default(), | ||
host: "test.host".into(), | ||
path: "/testpath".into(), | ||
tls: Some(transport::tls::OutboundBuilder::default()), | ||
})), | ||
}), | ||
); | ||
// Without host and path | ||
check_v2rayn( | ||
|
@@ -475,12 +467,12 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::Ws(transport::ws::OutboundBuilder { | ||
&TransportBuilder::Ws(transport::ws::OutboundBuilder { | ||
headers: Default::default(), | ||
path: Default::default(), | ||
host: Default::default(), | ||
tls: Some(transport::tls::OutboundBuilder::default()), | ||
})), | ||
}), | ||
); | ||
} | ||
|
||
|
@@ -500,11 +492,11 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::from(transport::h2::OutboundBuilder { | ||
&TransportBuilder::from(transport::h2::OutboundBuilder { | ||
host: Default::default(), | ||
path: "/testpath".into(), | ||
tls: None, | ||
})), | ||
}), | ||
); | ||
// With host | ||
check_v2rayn( | ||
|
@@ -519,11 +511,11 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::from(transport::h2::OutboundBuilder { | ||
&TransportBuilder::from(transport::h2::OutboundBuilder { | ||
host: "test.host".into(), | ||
path: Default::default(), | ||
tls: None, | ||
})), | ||
}), | ||
); | ||
// Without host and path | ||
check_v2rayn( | ||
|
@@ -538,11 +530,11 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::from(transport::h2::OutboundBuilder { | ||
&TransportBuilder::from(transport::h2::OutboundBuilder { | ||
host: Default::default(), | ||
path: Default::default(), | ||
tls: None, | ||
})), | ||
}), | ||
); | ||
} | ||
|
||
|
@@ -562,11 +554,11 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::from(transport::h2::OutboundBuilder { | ||
&TransportBuilder::from(transport::h2::OutboundBuilder { | ||
host: Default::default(), | ||
path: "/testpath".into(), | ||
tls: Some(transport::tls::OutboundBuilder::default()), | ||
})), | ||
}), | ||
); | ||
// Without host and path | ||
check_v2rayn( | ||
|
@@ -581,26 +573,26 @@ mod parse_v2rayn_impl { | |
sec: SecurityTypeBuilder::Auto, | ||
use_legacy_header: false, | ||
}, | ||
Some(TransportBuilder::from(transport::h2::OutboundBuilder { | ||
&TransportBuilder::from(transport::h2::OutboundBuilder { | ||
host: Default::default(), | ||
path: Default::default(), | ||
tls: Some(transport::tls::OutboundBuilder::default()), | ||
})), | ||
}), | ||
); | ||
} | ||
|
||
fn check_mixed( | ||
input: &str, | ||
expected_tag: Option<&str>, | ||
expected_settings: &SettingsBuilder, | ||
expected_transport: Option<TransportBuilder>, | ||
expected_transport: &TransportBuilder, | ||
) { | ||
let input = Url::from_str(input).unwrap(); | ||
let expected_tag = expected_tag.map(Into::into); | ||
let (tag, settings, transport) = SettingsBuilder::parse_url(&input).unwrap(); | ||
assert_eq!(&tag, &expected_tag); | ||
assert_eq!(&settings, expected_settings); | ||
assert_eq!(transport, expected_transport); | ||
assert_eq!(&transport, expected_transport); | ||
} | ||
|
||
#[test] | ||
|
@@ -616,7 +608,7 @@ mod parse_v2rayn_impl { | |
encryption=auto#%E6%B5%8B%E8%AF%95", | ||
None, | ||
&expected_settings, | ||
None, | ||
&Default::default(), | ||
); | ||
check_mixed( | ||
"vmess://eyJhZGQiOiJ0ZXN0LnNlcnZlci5jb20iLCJwcyI6Iua1i+ivlSIsInNjeSI\ | ||
|
@@ -625,7 +617,7 @@ mod parse_v2rayn_impl { | |
2NTdkNGZlYjNlIiwibmV0IjoidGNwIn0=", | ||
Some("测试"), | ||
&expected_settings, | ||
None, | ||
&Default::default(), | ||
); | ||
} | ||
} | ||
|
Oops, something went wrong.