From c3f33aefddadcbe89888805105f837cb73590ed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Wed, 4 May 2016 14:03:29 +0200 Subject: [PATCH] Fixing RPC modules compatibility --- Cargo.lock | 1 + parity/rpc.rs | 2 +- rpc/src/v1/impls/rpc.rs | 28 +++++++++++++++++++++++----- rpc/src/v1/tests/mod.rs | 2 ++ rpc/src/v1/tests/rpc.rs | 18 ++++++++++++++++-- rpc/src/v1/traits/rpc.rs | 7 +++++-- 6 files changed, 48 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9c963809..fd99ff8f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -348,6 +348,7 @@ dependencies = [ "libc 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.4.3 (git+https://github.com/arkpar/rust-rocksdb.git)", "rust-crypto 0.2.35 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/parity/rpc.rs b/parity/rpc.rs index ff853d478..77b3b7f88 100644 --- a/parity/rpc.rs +++ b/parity/rpc.rs @@ -112,7 +112,7 @@ pub fn setup_rpc_server( server.add_delegate(PersonalClient::new(&deps.secret_store).to_delegate()) }, "ethcore" => { - // not adding to modules, since `ethcore` is not supported in geth + modules.insert("ethcore".to_owned(), "1.0".to_owned()); server.add_delegate(EthcoreClient::new(&deps.miner, deps.logger.clone(), deps.settings.clone()).to_delegate()) }, "traces" => { diff --git a/rpc/src/v1/impls/rpc.rs b/rpc/src/v1/impls/rpc.rs index 215834f17..ebbef5025 100644 --- a/rpc/src/v1/impls/rpc.rs +++ b/rpc/src/v1/impls/rpc.rs @@ -22,23 +22,41 @@ use v1::traits::Rpc; /// RPC generic methods implementation. pub struct RpcClient { modules: BTreeMap, + valid_apis: Vec, } impl RpcClient { /// Creates new `RpcClient`. pub fn new(modules: BTreeMap) -> Self { + // geth 1.3.6 fails upon receiving unknown api + let valid_apis = vec!["web3", "eth", "net", "personal", "rpc"]; + RpcClient { - modules: modules + modules: modules, + valid_apis: valid_apis.into_iter().map(|x| x.to_owned()).collect(), } } } impl Rpc for RpcClient { + fn rpc_modules(&self, _: Params) -> Result { + let modules = self.modules.iter() + .fold(BTreeMap::new(), |mut map, (k, v)| { + map.insert(k.to_owned(), Value::String(v.to_owned())); + map + }); + Ok(Value::Object(modules)) + } + fn modules(&self, _: Params) -> Result { - let modules = self.modules.iter().fold(BTreeMap::new(), |mut map, (k, v)| { - map.insert(k.to_owned(), Value::String(v.to_owned())); - map - }); + let modules = self.modules.iter() + .filter(|&(k, _v)| { + self.valid_apis.contains(k) + }) + .fold(BTreeMap::new(), |mut map, (k, v)| { + map.insert(k.to_owned(), Value::String(v.to_owned())); + map + }); Ok(Value::Object(modules)) } } diff --git a/rpc/src/v1/tests/mod.rs b/rpc/src/v1/tests/mod.rs index e09b09db1..04e0dc142 100644 --- a/rpc/src/v1/tests/mod.rs +++ b/rpc/src/v1/tests/mod.rs @@ -27,3 +27,5 @@ mod web3; mod personal; #[cfg(test)] mod ethcore; +#[cfg(test)] +mod rpc; diff --git a/rpc/src/v1/tests/rpc.rs b/rpc/src/v1/tests/rpc.rs index b2c58dda6..4415f39e5 100644 --- a/rpc/src/v1/tests/rpc.rs +++ b/rpc/src/v1/tests/rpc.rs @@ -22,17 +22,31 @@ use v1::{Rpc, RpcClient}; fn rpc_client() -> RpcClient { let mut modules = BTreeMap::new(); modules.insert("rpc".to_owned(), "1.0".to_owned()); + modules.insert("web3".to_owned(), "1.0".to_owned()); + modules.insert("ethcore".to_owned(), "1.0".to_owned()); RpcClient::new(modules) } +#[test] +fn modules() { + let rpc = rpc_client().to_delegate(); + let io = IoHandler::new(); + io.add_delegate(rpc); + + let request = r#"{"jsonrpc": "2.0", "method": "modules", "params": [], "id": 1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"rpc":"1.0","web3":"1.0"},"id":1}"#; + + assert_eq!(io.handle_request(request), Some(response.to_owned())); +} + #[test] fn rpc_modules() { let rpc = rpc_client().to_delegate(); let io = IoHandler::new(); io.add_delegate(rpc); - let request = r#"{"jsonrpc": "2.0", "method": "modules", "params": [], "id": 1}"#; - let response = r#"{"jsonrpc":"2.0","result":{"eth": "1.0"},"id":1}"#; + let request = r#"{"jsonrpc": "2.0", "method": "rpc_modules", "params": [], "id": 1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"ethcore":"1.0","rpc":"1.0","web3":"1.0"},"id":1}"#; assert_eq!(io.handle_request(request), Some(response.to_owned())); } diff --git a/rpc/src/v1/traits/rpc.rs b/rpc/src/v1/traits/rpc.rs index 9d19efcd7..5c981c8a1 100644 --- a/rpc/src/v1/traits/rpc.rs +++ b/rpc/src/v1/traits/rpc.rs @@ -22,16 +22,19 @@ use jsonrpc_core::*; /// RPC Interface. pub trait Rpc: Sized + Send + Sync + 'static { - /// Returns supported modules. + /// Returns supported modules for Geth 1.3.6 fn modules(&self, _: Params) -> Result { rpc_unimplemented!() } + /// Returns supported modules for Geth 1.4.0 + fn rpc_modules(&self, _: Params) -> Result { rpc_unimplemented!() } + /// Should be used to convert object to io delegate. fn to_delegate(self) -> IoDelegate { let mut delegate = IoDelegate::new(Arc::new(self)); // Geth 1.3.6 compatibility delegate.add_method("modules", Rpc::modules); // Geth 1.4.0 compatibility - delegate.add_method("rpc_modules", Rpc::modules); + delegate.add_method("rpc_modules", Rpc::rpc_modules); delegate } }