Skip to content

Commit

Permalink
Revert "Remove Empty in in/outbound"
Browse files Browse the repository at this point in the history
Some fixes.
This reverts commit ec78444.
  • Loading branch information
red-dal committed Jul 20, 2022
1 parent b104822 commit d2644f0
Show file tree
Hide file tree
Showing 8 changed files with 252 additions and 142 deletions.
114 changes: 53 additions & 61 deletions ladder_lib/src/proxy/vmess/outbound/parse_url_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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"))]
Expand All @@ -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()),
};
Expand Down Expand Up @@ -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\
Expand All @@ -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,
}),
})),
}),
),
),
];
Expand Down Expand Up @@ -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());
}
Expand Down Expand Up @@ -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() {
Expand All @@ -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()),
}
}
Expand All @@ -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))
Expand Down Expand Up @@ -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]
Expand All @@ -369,7 +363,7 @@ mod parse_v2rayn_impl {
sec: SecurityTypeBuilder::Auto,
use_legacy_header: false,
},
None,
&TransportBuilder::default(),
);
}

Expand All @@ -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()),
);
}

Expand All @@ -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(
Expand All @@ -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,
})),
}),
);
}

Expand All @@ -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(
Expand All @@ -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()),
})),
}),
);
}

Expand All @@ -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(
Expand All @@ -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(
Expand All @@ -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,
})),
}),
);
}

Expand All @@ -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(
Expand All @@ -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]
Expand All @@ -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\
Expand All @@ -625,7 +617,7 @@ mod parse_v2rayn_impl {
2NTdkNGZlYjNlIiwibmV0IjoidGNwIn0=",
Some("测试"),
&expected_settings,
None,
&Default::default(),
);
}
}
Expand Down
Loading

0 comments on commit d2644f0

Please sign in to comment.