From e2e94c088955bafc252e5af77a2ef0aab6620f4d Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Wed, 17 Nov 2021 14:25:55 +0100 Subject: [PATCH 1/7] jsonrpsee: fallback to random port --- client/rpc-servers/src/lib.rs | 21 +++++++++++++-------- client/service/src/lib.rs | 11 +++++++++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index 5b1d70f4f4664..8c55fc679863b 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -20,6 +20,7 @@ #![warn(missing_docs)] +use std::net::SocketAddr; use jsonrpsee::{ http_server::{AccessControlBuilder, HttpServerBuilder, HttpServerHandle}, ws_server::{WsServerBuilder, WsServerHandle}, @@ -81,7 +82,7 @@ pub type WsServer = WsServerHandle; /// Start HTTP server listening on given address. pub fn start_http( - addr: std::net::SocketAddr, + addrs: [SocketAddr; 2], cors: Option<&Vec>, maybe_max_payload_mb: Option, module: RpcModule, @@ -93,11 +94,13 @@ pub fn start_http( let mut acl = AccessControlBuilder::new(); - log::info!("Starting JSON-RPC HTTP server: addr={}, allowed origins={:?}", addr, cors); + log::info!("Starting JSON-RPC HTTP server: addr={:?}, allowed origins={:?}", addrs, cors); if let Some(cors) = cors { // Whitelist listening address. - acl = acl.set_allowed_hosts(format_allowed_hosts(addr.port()))?; + // TODO(niklasad1): this is bad we don't know which port that actually was used.. + acl = acl.set_allowed_hosts(format_allowed_hosts(addrs[0].port()))?; + acl = acl.set_allowed_hosts(format_allowed_hosts(addrs[1].port()))?; acl = acl.set_allowed_origins(cors)?; }; @@ -105,7 +108,7 @@ pub fn start_http( .max_request_body_size(max_request_body_size as u32) .set_access_control(acl.build()) .custom_tokio_runtime(rt) - .build(addr)?; + .build(&addrs as &[SocketAddr])?; let rpc_api = build_rpc_api(module); let handle = server.start(rpc_api)?; @@ -115,7 +118,7 @@ pub fn start_http( /// Start WS server listening on given address. pub fn start_ws( - addr: std::net::SocketAddr, + addrs: [SocketAddr; 2], max_connections: Option, cors: Option<&Vec>, maybe_max_payload_mb: Option, @@ -132,15 +135,17 @@ pub fn start_ws( .max_connections(max_connections as u64) .custom_tokio_runtime(rt.clone()); - log::info!("Starting JSON-RPC WS server: addr={}, allowed origins={:?}", addr, cors); + log::info!("Starting JSON-RPC WS server: addrs={:?}, allowed origins={:?}", addrs, cors); if let Some(cors) = cors { // Whitelist listening address. - builder = builder.set_allowed_hosts(format_allowed_hosts(addr.port()))?; + // TODO(niklasad1): this is bad we don't know which port that actually was used.. + builder = builder.set_allowed_hosts(format_allowed_hosts(addrs[0].port()))?; + builder = builder.set_allowed_hosts(format_allowed_hosts(addrs[1].port()))?; builder = builder.set_allowed_origins(cors)?; } - let server = tokio::task::block_in_place(|| rt.block_on(builder.build(addr)))?; + let server = tokio::task::block_in_place(|| rt.block_on(builder.build(&addrs as &[SocketAddr])))?; let rpc_api = build_rpc_api(module); let handle = server.start(rpc_api)?; diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 77c2cb385dd13..6e2efa719f2d9 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -323,11 +323,18 @@ where } } + let random_port = |mut addr: SocketAddr| { + addr.set_port(0); + addr + }; + let ws_addr = config.rpc_ws.unwrap_or_else(|| "127.0.0.1:9944".parse().unwrap()); + let ws_addr2 = random_port(ws_addr); let http_addr = config.rpc_http.unwrap_or_else(|| "127.0.0.1:9933".parse().unwrap()); + let http_addr2 = random_port(http_addr); let http = sc_rpc_server::start_http( - http_addr, + [http_addr, http_addr2], config.rpc_cors.as_ref(), config.rpc_max_payload, gen_rpc_module(deny_unsafe(ws_addr, &config.rpc_methods))?, @@ -336,7 +343,7 @@ where .map_err(|e| Error::Application(e.into()))?; let ws = sc_rpc_server::start_ws( - ws_addr, + [ws_addr, ws_addr2], config.rpc_ws_max_connections, config.rpc_cors.as_ref(), config.rpc_max_payload, From ee201377244d2d851abcb1f35e94514faf2f26c4 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 18 Nov 2021 10:02:35 +0100 Subject: [PATCH 2/7] better comment --- client/rpc-servers/src/lib.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index 8c55fc679863b..bbd082e8a99a7 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -98,7 +98,7 @@ pub fn start_http( if let Some(cors) = cors { // Whitelist listening address. - // TODO(niklasad1): this is bad we don't know which port that actually was used.. + // NOTE: set_allowed_hosts will whitelist both ports but only one will used. acl = acl.set_allowed_hosts(format_allowed_hosts(addrs[0].port()))?; acl = acl.set_allowed_hosts(format_allowed_hosts(addrs[1].port()))?; acl = acl.set_allowed_origins(cors)?; @@ -139,7 +139,7 @@ pub fn start_ws( if let Some(cors) = cors { // Whitelist listening address. - // TODO(niklasad1): this is bad we don't know which port that actually was used.. + // NOTE: set_allowed_hosts will whitelist both ports but only one will used. builder = builder.set_allowed_hosts(format_allowed_hosts(addrs[0].port()))?; builder = builder.set_allowed_hosts(format_allowed_hosts(addrs[1].port()))?; builder = builder.set_allowed_origins(cors)?; @@ -159,7 +159,6 @@ fn format_allowed_hosts(port: u16) -> [String; 2] { fn build_rpc_api(mut rpc_api: RpcModule) -> RpcModule { let mut available_methods = rpc_api.method_names().collect::>(); - available_methods.push("rpc_methods"); available_methods.sort_unstable(); rpc_api From 87ce949361b013ebda71a4f2e55d73ea7657d60c Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 18 Nov 2021 10:37:10 +0100 Subject: [PATCH 3/7] Update client/rpc-servers/src/lib.rs Co-authored-by: Maciej Hirsz <1096222+maciejhirsz@users.noreply.github.com> --- client/rpc-servers/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index bbd082e8a99a7..8146c5c8d4f85 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -145,7 +145,7 @@ pub fn start_ws( builder = builder.set_allowed_origins(cors)?; } - let server = tokio::task::block_in_place(|| rt.block_on(builder.build(&addrs as &[SocketAddr])))?; + let server = tokio::task::block_in_place(|| rt.block_on(builder.build(&addrs[..])))?; let rpc_api = build_rpc_api(module); let handle = server.start(rpc_api)?; From c5f79446e8addec974a885f9cd0401677f2d3011 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 18 Nov 2021 10:40:55 +0100 Subject: [PATCH 4/7] Update client/rpc-servers/src/lib.rs Co-authored-by: Maciej Hirsz <1096222+maciejhirsz@users.noreply.github.com> --- client/rpc-servers/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index 8146c5c8d4f85..5470c876a6a3f 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -108,7 +108,7 @@ pub fn start_http( .max_request_body_size(max_request_body_size as u32) .set_access_control(acl.build()) .custom_tokio_runtime(rt) - .build(&addrs as &[SocketAddr])?; + .build(&addrs[..])?; let rpc_api = build_rpc_api(module); let handle = server.start(rpc_api)?; From dec141f7cf76fb7035db4f1cab250046a074b693 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 18 Nov 2021 11:48:40 +0100 Subject: [PATCH 5/7] address grumbles --- client/rpc-servers/src/lib.rs | 19 +++++++++++-------- client/service/src/lib.rs | 8 ++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index 5470c876a6a3f..99f1252301c6d 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -82,7 +82,7 @@ pub type WsServer = WsServerHandle; /// Start HTTP server listening on given address. pub fn start_http( - addrs: [SocketAddr; 2], + addrs: &[SocketAddr], cors: Option<&Vec>, maybe_max_payload_mb: Option, module: RpcModule, @@ -99,8 +99,7 @@ pub fn start_http( if let Some(cors) = cors { // Whitelist listening address. // NOTE: set_allowed_hosts will whitelist both ports but only one will used. - acl = acl.set_allowed_hosts(format_allowed_hosts(addrs[0].port()))?; - acl = acl.set_allowed_hosts(format_allowed_hosts(addrs[1].port()))?; + acl = acl.set_allowed_hosts(format_allowed_hosts(addrs))?; acl = acl.set_allowed_origins(cors)?; }; @@ -118,7 +117,7 @@ pub fn start_http( /// Start WS server listening on given address. pub fn start_ws( - addrs: [SocketAddr; 2], + addrs: &[SocketAddr], max_connections: Option, cors: Option<&Vec>, maybe_max_payload_mb: Option, @@ -140,8 +139,7 @@ pub fn start_ws( if let Some(cors) = cors { // Whitelist listening address. // NOTE: set_allowed_hosts will whitelist both ports but only one will used. - builder = builder.set_allowed_hosts(format_allowed_hosts(addrs[0].port()))?; - builder = builder.set_allowed_hosts(format_allowed_hosts(addrs[1].port()))?; + builder = builder.set_allowed_hosts(format_allowed_hosts(addrs))?; builder = builder.set_allowed_origins(cors)?; } @@ -153,8 +151,13 @@ pub fn start_ws( Ok(handle) } -fn format_allowed_hosts(port: u16) -> [String; 2] { - [format!("localhost:{}", port), format!("127.0.0.1:{}", port)] +fn format_allowed_hosts(addrs: &[SocketAddr]) -> Vec { + let mut hosts = Vec::with_capacity(addrs.len() * 2); + for addr in addrs { + hosts.push(format!("localhost:{}", addr.port())); + hosts.push(format!("127.0.0.1:{}", addr.port())); + } + hosts } fn build_rpc_api(mut rpc_api: RpcModule) -> RpcModule { diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 6e2efa719f2d9..e360f6299c1e3 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -328,13 +328,13 @@ where addr }; - let ws_addr = config.rpc_ws.unwrap_or_else(|| "127.0.0.1:9944".parse().unwrap()); + let ws_addr = config.rpc_ws.unwrap_or_else(|| "127.0.0.1:9944".parse().expect("valid sockaddr; qed")); let ws_addr2 = random_port(ws_addr); - let http_addr = config.rpc_http.unwrap_or_else(|| "127.0.0.1:9933".parse().unwrap()); + let http_addr = config.rpc_http.unwrap_or_else(|| "127.0.0.1:9933".parse().expect("valid sockaddr; qed")); let http_addr2 = random_port(http_addr); let http = sc_rpc_server::start_http( - [http_addr, http_addr2], + &[http_addr, http_addr2], config.rpc_cors.as_ref(), config.rpc_max_payload, gen_rpc_module(deny_unsafe(ws_addr, &config.rpc_methods))?, @@ -343,7 +343,7 @@ where .map_err(|e| Error::Application(e.into()))?; let ws = sc_rpc_server::start_ws( - [ws_addr, ws_addr2], + &[ws_addr, ws_addr2], config.rpc_ws_max_connections, config.rpc_cors.as_ref(), config.rpc_max_payload, From 59962931840ac4b9879f66ecd352b5c164a722c9 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 18 Nov 2021 11:59:04 +0100 Subject: [PATCH 6/7] cargo fmt --- client/rpc-servers/src/lib.rs | 2 +- client/service/src/lib.rs | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index 99f1252301c6d..95f7972108e70 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -20,12 +20,12 @@ #![warn(missing_docs)] -use std::net::SocketAddr; use jsonrpsee::{ http_server::{AccessControlBuilder, HttpServerBuilder, HttpServerHandle}, ws_server::{WsServerBuilder, WsServerHandle}, RpcModule, }; +use std::net::SocketAddr; const MEGABYTE: usize = 1024 * 1024; diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index e360f6299c1e3..01abae5f1dafa 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -328,9 +328,13 @@ where addr }; - let ws_addr = config.rpc_ws.unwrap_or_else(|| "127.0.0.1:9944".parse().expect("valid sockaddr; qed")); + let ws_addr = config + .rpc_ws + .unwrap_or_else(|| "127.0.0.1:9944".parse().expect("valid sockaddr; qed")); let ws_addr2 = random_port(ws_addr); - let http_addr = config.rpc_http.unwrap_or_else(|| "127.0.0.1:9933".parse().expect("valid sockaddr; qed")); + let http_addr = config + .rpc_http + .unwrap_or_else(|| "127.0.0.1:9933".parse().expect("valid sockaddr; qed")); let http_addr2 = random_port(http_addr); let http = sc_rpc_server::start_http( From b405606905dbadbbb25d006fef87e1e4a92244da Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Thu, 18 Nov 2021 12:02:24 +0100 Subject: [PATCH 7/7] addrs already slice --- client/rpc-servers/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index 95f7972108e70..15ed975ba97a6 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -107,7 +107,7 @@ pub fn start_http( .max_request_body_size(max_request_body_size as u32) .set_access_control(acl.build()) .custom_tokio_runtime(rt) - .build(&addrs[..])?; + .build(addrs)?; let rpc_api = build_rpc_api(module); let handle = server.start(rpc_api)?; @@ -143,7 +143,7 @@ pub fn start_ws( builder = builder.set_allowed_origins(cors)?; } - let server = tokio::task::block_in_place(|| rt.block_on(builder.build(&addrs[..])))?; + let server = tokio::task::block_in_place(|| rt.block_on(builder.build(addrs)))?; let rpc_api = build_rpc_api(module); let handle = server.start(rpc_api)?;