From ae133bb803b8bf852b90bcafb9f88e1ff2718df3 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 13 Jan 2023 15:14:25 +0700 Subject: [PATCH 1/5] join dns with another instance of WS transport Secure Websocket transport needs unresolved addresses, so we join DNS transport with yet another instance of Websocket transport. Closes #12024 --- client/network/src/transport.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index 6c792a0c38042..f64d313016dc4 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -55,17 +55,20 @@ pub fn build_transport( // Build the base layer of the transport. let transport = if !memory_only { let tcp_config = tcp::Config::new().nodelay(true); - let desktop_trans = tcp::tokio::Transport::new(tcp_config.clone()); - let desktop_trans = websocket::WsConfig::new(desktop_trans) + let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); + let desktop_trans = websocket::WsConfig::new(tcp_trans) .or_transport(tcp::tokio::Transport::new(tcp_config.clone())); let dns_init = dns::TokioDnsConfig::system(desktop_trans); EitherTransport::Left(if let Ok(dns) = dns_init { - EitherTransport::Left(dns) + // Secure Websocket transport needs unresolved addresses, so we join DNS transport with + // yet another instance of Websocket transport. + let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); + EitherTransport::Left(dns.or_transport(websocket::WsConfig::new(tcp_trans))) } else { - let desktop_trans = tcp::tokio::Transport::new(tcp_config.clone()); - let desktop_trans = websocket::WsConfig::new(desktop_trans) + let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); + let desktop_trans = websocket::WsConfig::new(tcp_trans) .or_transport(tcp::tokio::Transport::new(tcp_config)); - EitherTransport::Right(desktop_trans.map_err(dns::DnsErr::Transport)) + EitherTransport::Right(desktop_trans) }) } else { EitherTransport::Right(OptionalTransport::some( From 8c599297217a81d014081a9bf1b327b0d1a1ab1e Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 16 Jan 2023 18:51:37 +0700 Subject: [PATCH 2/5] WSS transport itself need to wrap DNS transport in order to resolve addresses before passing them down to TCP transport Refs https://github.com/libp2p/rust-libp2p/issues/3330 --- client/network/src/transport.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index f64d313016dc4..d64507165f712 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -60,10 +60,17 @@ pub fn build_transport( .or_transport(tcp::tokio::Transport::new(tcp_config.clone())); let dns_init = dns::TokioDnsConfig::system(desktop_trans); EitherTransport::Left(if let Ok(dns) = dns_init { + let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); + let desktop_trans = websocket::WsConfig::new(tcp_trans) + .or_transport(tcp::tokio::Transport::new(tcp_config.clone())); + let dns_init = dns::TokioDnsConfig::system(desktop_trans); // Secure Websocket transport needs unresolved addresses, so we join DNS transport with // yet another instance of Websocket transport. - let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); - EitherTransport::Left(dns.or_transport(websocket::WsConfig::new(tcp_trans))) + EitherTransport::Left( + dns_init + .expect("same config to work") + .or_transport(websocket::WsConfig::new(dns)), + ) } else { let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); let desktop_trans = websocket::WsConfig::new(tcp_trans) From 2347cf66dae1e5f61192f5c6069670dcc41a1a14 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 16 Jan 2023 19:04:25 +0700 Subject: [PATCH 3/5] reverse order --- client/network/src/transport.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index d64507165f712..cd00885215282 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -67,9 +67,7 @@ pub fn build_transport( // Secure Websocket transport needs unresolved addresses, so we join DNS transport with // yet another instance of Websocket transport. EitherTransport::Left( - dns_init - .expect("same config to work") - .or_transport(websocket::WsConfig::new(dns)), + websocket::WsConfig::new(dns).or_transport(dns_init.expect("same config to work")), ) } else { let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); From 756ef866b2fc8b78c93568078310af4b7ce9907c Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 17 Jan 2023 12:23:43 +0700 Subject: [PATCH 4/5] simplify code: remove WS from WSS inner DNS transport --- client/network/src/transport.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index cd00885215282..e3fcdc82a009d 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -54,21 +54,23 @@ pub fn build_transport( ) -> (Boxed<(PeerId, StreamMuxerBox)>, Arc) { // Build the base layer of the transport. let transport = if !memory_only { + // Main transport: DNS(TCP + WS) let tcp_config = tcp::Config::new().nodelay(true); let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); let desktop_trans = websocket::WsConfig::new(tcp_trans) .or_transport(tcp::tokio::Transport::new(tcp_config.clone())); let dns_init = dns::TokioDnsConfig::system(desktop_trans); + EitherTransport::Left(if let Ok(dns) = dns_init { - let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); - let desktop_trans = websocket::WsConfig::new(tcp_trans) - .or_transport(tcp::tokio::Transport::new(tcp_config.clone())); - let dns_init = dns::TokioDnsConfig::system(desktop_trans); - // Secure Websocket transport needs unresolved addresses, so we join DNS transport with - // yet another instance of Websocket transport. - EitherTransport::Left( - websocket::WsConfig::new(dns).or_transport(dns_init.expect("same config to work")), - ) + // WSS transport + // + // Main transport can't be used for `/wss` addresses because WSS transport needs + // unresolved addresses (BUT WSS transport itself needs an instance of DNS transport to + // resolve and dial addresses). + let tcp_trans = tcp::tokio::Transport::new(tcp_config); + let dns_only_tcp = dns::TokioDnsConfig::system(tcp_trans) + .expect("same system_conf & resolver to work"); + EitherTransport::Left(websocket::WsConfig::new(dns_only_tcp).or_transport(dns)) } else { let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); let desktop_trans = websocket::WsConfig::new(tcp_trans) From e3cac2289fff16057ff96149585aa20c932b2c40 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 17 Jan 2023 16:42:38 +0700 Subject: [PATCH 5/5] remove the 2nd instance of WS transport --- client/network/src/transport.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index e3fcdc82a009d..51a8483e0e4e6 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -54,24 +54,23 @@ pub fn build_transport( ) -> (Boxed<(PeerId, StreamMuxerBox)>, Arc) { // Build the base layer of the transport. let transport = if !memory_only { - // Main transport: DNS(TCP + WS) + // Main transport: DNS(TCP) let tcp_config = tcp::Config::new().nodelay(true); let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); - let desktop_trans = websocket::WsConfig::new(tcp_trans) - .or_transport(tcp::tokio::Transport::new(tcp_config.clone())); - let dns_init = dns::TokioDnsConfig::system(desktop_trans); + let dns_init = dns::TokioDnsConfig::system(tcp_trans); EitherTransport::Left(if let Ok(dns) = dns_init { - // WSS transport + // WS + WSS transport // // Main transport can't be used for `/wss` addresses because WSS transport needs // unresolved addresses (BUT WSS transport itself needs an instance of DNS transport to // resolve and dial addresses). let tcp_trans = tcp::tokio::Transport::new(tcp_config); - let dns_only_tcp = dns::TokioDnsConfig::system(tcp_trans) + let dns_for_wss = dns::TokioDnsConfig::system(tcp_trans) .expect("same system_conf & resolver to work"); - EitherTransport::Left(websocket::WsConfig::new(dns_only_tcp).or_transport(dns)) + EitherTransport::Left(websocket::WsConfig::new(dns_for_wss).or_transport(dns)) } else { + // In case DNS can't be constructed, fallback to TCP + WS (WSS won't work) let tcp_trans = tcp::tokio::Transport::new(tcp_config.clone()); let desktop_trans = websocket::WsConfig::new(tcp_trans) .or_transport(tcp::tokio::Transport::new(tcp_config));