From ea09aa584d0f2a47105cf15875e7ec72097ea557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 13 Apr 2017 16:32:07 +0200 Subject: [PATCH] WebSockets RPC server (#5425) * Basic WS server. * CLI for WS server. * Bump jsonrpc * Fixing test. --- .gitlab-ci.yml | 2 +- Cargo.lock | 139 ++++++++++++++++++++------------- Cargo.toml | 10 +-- dapps/src/rpc.rs | 2 +- parity/cli/config.full.toml | 8 ++ parity/cli/config.toml | 3 + parity/cli/mod.rs | 43 +++++++++- parity/cli/usage.txt | 23 +++++- parity/configuration.rs | 38 ++++++++- parity/dapps.rs | 2 +- parity/informant.rs | 4 +- parity/main.rs | 8 +- parity/rpc.rs | 123 +++++++++++++++++++++++------ parity/rpc_apis.rs | 12 +-- parity/run.rs | 9 ++- parity/signer.rs | 12 +-- rpc/Cargo.toml | 5 +- rpc/rpctest/Cargo.toml | 4 +- rpc/rpctest/src/main.rs | 10 +-- rpc/src/lib.rs | 29 ++++++- rpc/src/v1/types/provenance.rs | 7 ++ rpc_cli/Cargo.toml | 2 +- rpc_cli/src/lib.rs | 8 +- rpc_client/Cargo.toml | 2 +- rpc_client/src/lib.rs | 12 +-- scripts/targets.sh | 2 +- signer/Cargo.toml | 2 +- signer/src/lib.rs | 8 +- 28 files changed, 388 insertions(+), 141 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5d90c5d4e..1c2ad13d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -541,7 +541,7 @@ test-windows: - git submodule update --init --recursive script: - set RUST_BACKTRACE=1 - - echo cargo test --features json-tests -p rlp -p ethash -p ethcore -p ethcore-bigint -p ethcore-dapps -p ethcore-rpc -p ethcore-signer -p ethcore-util -p ethcore-network -p ethcore-io -p ethkey -p ethstore -p ethsync -p ethcore-ipc -p ethcore-ipc-tests -p ethcore-ipc-nano -p parity %CARGOFLAGS% --verbose --release + - echo cargo test --features json-tests -p rlp -p ethash -p ethcore -p ethcore-bigint -p ethcore-dapps -p parity-rpc -p ethcore-signer -p ethcore-util -p ethcore-network -p ethcore-io -p ethkey -p ethstore -p ethsync -p ethcore-ipc -p ethcore-ipc-tests -p ethcore-ipc-nano -p parity %CARGOFLAGS% --verbose --release tags: - rust-windows allow_failure: true diff --git a/Cargo.lock b/Cargo.lock index d8561cd11..8208f583e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,7 +18,6 @@ dependencies = [ "ethcore-ipc-tests 0.1.0", "ethcore-light 1.7.0", "ethcore-logger 1.7.0", - "ethcore-rpc 1.7.0", "ethcore-secretstore 1.0.0", "ethcore-signer 1.7.0", "ethcore-stratum 1.7.0", @@ -38,6 +37,7 @@ dependencies = [ "parity-ipfs-api 1.7.0", "parity-local-store 0.1.0", "parity-reactor 0.1.0", + "parity-rpc 1.7.0", "parity-rpc-client 1.4.0", "parity-updater 1.7.0", "path 0.1.0", @@ -592,49 +592,6 @@ dependencies = [ "tiny-keccak 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ethcore-rpc" -version = "1.7.0" -dependencies = [ - "cid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)", - "ethash 1.7.0", - "ethcore 1.7.0", - "ethcore-devtools 1.7.0", - "ethcore-io 1.7.0", - "ethcore-ipc 1.7.0", - "ethcore-light 1.7.0", - "ethcore-logger 1.7.0", - "ethcore-util 1.7.0", - "ethcrypto 0.1.0", - "ethjson 0.1.0", - "ethkey 0.2.0", - "ethstore 0.1.0", - "ethsync 1.7.0", - "fetch 0.1.0", - "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", - "jsonrpc-http-server 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", - "jsonrpc-ipc-server 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", - "jsonrpc-macros 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", - "jsonrpc-minihttp-server 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", - "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "multihash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-reactor 0.1.0", - "parity-updater 1.7.0", - "rlp 0.1.0", - "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", - "stats 0.1.0", - "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ethcore-secretstore" version = "1.0.0" @@ -674,12 +631,12 @@ dependencies = [ "env_logger 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-devtools 1.7.0", "ethcore-io 1.7.0", - "ethcore-rpc 1.7.0", "ethcore-util 1.7.0", "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "parity-dapps-glue 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-rpc 1.7.0", "parity-ui 1.7.0", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1080,7 +1037,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jsonrpc-core" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#32c1c083139db50db6a5d532ccfc2004236dbfc3" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#ad0682785a693eba3069e48b57ec89abb62c3b60" dependencies = [ "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1092,7 +1049,7 @@ dependencies = [ [[package]] name = "jsonrpc-http-server" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#32c1c083139db50db6a5d532ccfc2004236dbfc3" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#ad0682785a693eba3069e48b57ec89abb62c3b60" dependencies = [ "hyper 0.10.0-a.0 (git+https://github.com/paritytech/hyper)", "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", @@ -1105,7 +1062,7 @@ dependencies = [ [[package]] name = "jsonrpc-ipc-server" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#32c1c083139db50db6a5d532ccfc2004236dbfc3" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#ad0682785a693eba3069e48b57ec89abb62c3b60" dependencies = [ "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", @@ -1117,7 +1074,7 @@ dependencies = [ [[package]] name = "jsonrpc-macros" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#32c1c083139db50db6a5d532ccfc2004236dbfc3" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#ad0682785a693eba3069e48b57ec89abb62c3b60" dependencies = [ "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-pubsub 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", @@ -1127,7 +1084,7 @@ dependencies = [ [[package]] name = "jsonrpc-minihttp-server" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#32c1c083139db50db6a5d532ccfc2004236dbfc3" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#ad0682785a693eba3069e48b57ec89abb62c3b60" dependencies = [ "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", @@ -1141,7 +1098,7 @@ dependencies = [ [[package]] name = "jsonrpc-pubsub" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#32c1c083139db50db6a5d532ccfc2004236dbfc3" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#ad0682785a693eba3069e48b57ec89abb62c3b60" dependencies = [ "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1151,7 +1108,7 @@ dependencies = [ [[package]] name = "jsonrpc-server-utils" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#32c1c083139db50db6a5d532ccfc2004236dbfc3" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#ad0682785a693eba3069e48b57ec89abb62c3b60" dependencies = [ "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1162,7 +1119,7 @@ dependencies = [ [[package]] name = "jsonrpc-tcp-server" version = "7.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#32c1c083139db50db6a5d532ccfc2004236dbfc3" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#ad0682785a693eba3069e48b57ec89abb62c3b60" dependencies = [ "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", @@ -1172,6 +1129,17 @@ dependencies = [ "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "jsonrpc-ws-server" +version = "7.0.0" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7#ad0682785a693eba3069e48b57ec89abb62c3b60" +dependencies = [ + "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", + "jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", + "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "ws 0.6.0 (git+https://github.com/tomusdrw/ws-rs)", +] + [[package]] name = "kernel32-sys" version = "0.2.2" @@ -1708,16 +1676,60 @@ dependencies = [ "tokio-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-rpc" +version = "1.7.0" +dependencies = [ + "cid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)", + "ethash 1.7.0", + "ethcore 1.7.0", + "ethcore-devtools 1.7.0", + "ethcore-io 1.7.0", + "ethcore-ipc 1.7.0", + "ethcore-light 1.7.0", + "ethcore-logger 1.7.0", + "ethcore-util 1.7.0", + "ethcrypto 0.1.0", + "ethjson 0.1.0", + "ethkey 0.2.0", + "ethstore 0.1.0", + "ethsync 1.7.0", + "fetch 0.1.0", + "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", + "jsonrpc-http-server 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", + "jsonrpc-ipc-server 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", + "jsonrpc-macros 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", + "jsonrpc-minihttp-server 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", + "jsonrpc-ws-server 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", + "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "multihash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-reactor 0.1.0", + "parity-updater 1.7.0", + "rlp 0.1.0", + "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", + "stats 0.1.0", + "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-rpc-client" version = "1.4.0" dependencies = [ - "ethcore-rpc 1.7.0", "ethcore-signer 1.7.0", "ethcore-util 1.7.0", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)", "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-rpc 1.7.0", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2081,9 +2093,9 @@ name = "rpc-cli" version = "1.4.0" dependencies = [ "ethcore-bigint 0.1.2", - "ethcore-rpc 1.7.0", "ethcore-util 1.7.0", "futures 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-rpc 1.7.0", "parity-rpc-client 1.4.0", "rpassword 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2710,6 +2722,21 @@ dependencies = [ "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ws" +version = "0.6.0" +source = "git+https://github.com/tomusdrw/ws-rs#3259e7ca906c848beae109eb32e492871f8f397d" +dependencies = [ + "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -2824,6 +2851,7 @@ dependencies = [ "checksum jsonrpc-pubsub 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)" = "" "checksum jsonrpc-server-utils 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)" = "" "checksum jsonrpc-tcp-server 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)" = "" +"checksum jsonrpc-ws-server 7.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.7)" = "" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "49247ec2a285bb3dcb23cbd9c35193c025e7251bfce77c1d5da97e6362dffe7f" @@ -2981,6 +3009,7 @@ dependencies = [ "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum ws 0.5.3 (git+https://github.com/paritytech/ws-rs.git?branch=parity-1.7)" = "" +"checksum ws 0.6.0 (git+https://github.com/tomusdrw/ws-rs)" = "" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum xdg 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "77b831a5ba77110f438f0ac5583aafeb087f70432998ba6b7dcb1d32185db453" "checksum xml-rs 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65e74b96bd3179209dc70a980da6df843dff09e46eee103a0376c0949257e3ef" diff --git a/Cargo.toml b/Cargo.toml index 09af66e09..37effabb5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,6 @@ ethcore = { path = "ethcore" } ethcore-util = { path = "util" } ethcore-io = { path = "util/io" } ethcore-devtools = { path = "devtools" } -ethcore-rpc = { path = "rpc" } ethcore-signer = { path = "signer" } ethcore-ipc = { path = "ipc/rpc" } ethcore-ipc-nano = { path = "ipc/nano" } @@ -45,12 +44,13 @@ ethkey = { path = "ethkey" } evmbin = { path = "evmbin" } rlp = { path = "util/rlp" } rpc-cli = { path = "rpc_cli" } -parity-rpc-client = { path = "rpc_client" } parity-hash-fetch = { path = "hash-fetch" } parity-ipfs-api = { path = "ipfs" } -parity-updater = { path = "updater" } -parity-reactor = { path = "util/reactor" } parity-local-store = { path = "local-store" } +parity-reactor = { path = "util/reactor" } +parity-rpc = { path = "rpc" } +parity-rpc-client = { path = "rpc_client" } +parity-updater = { path = "updater" } path = { path = "util/path" } parity-dapps = { path = "dapps", optional = true } @@ -85,7 +85,7 @@ ui-precompiled = [ dapps = ["parity-dapps"] ipc = ["ethcore/ipc", "ethsync/ipc"] jit = ["ethcore/jit"] -dev = ["clippy", "ethcore/dev", "ethcore-util/dev", "ethsync/dev", "ethcore-rpc/dev", "parity-dapps/dev", "ethcore-signer/dev"] +dev = ["clippy", "ethcore/dev", "ethcore-util/dev", "ethsync/dev", "parity-rpc/dev", "parity-dapps/dev", "ethcore-signer/dev"] json-tests = ["ethcore/json-tests"] test-heavy = ["ethcore/test-heavy"] ethkey-cli = ["ethcore/ethkey-cli"] diff --git a/dapps/src/rpc.rs b/dapps/src/rpc.rs index b743408dc..74c6d8d89 100644 --- a/dapps/src/rpc.rs +++ b/dapps/src/rpc.rs @@ -17,7 +17,7 @@ use std::sync::Arc; use hyper; -use ethcore_rpc::{Metadata, Origin}; +use parity_rpc::{Metadata, Origin}; use jsonrpc_core::{Middleware, MetaIoHandler}; use jsonrpc_http_server::{self as http, AccessControlAllowOrigin, HttpMetaExtractor}; use jsonrpc_http_server::tokio_core::reactor::Remote; diff --git a/parity/cli/config.full.toml b/parity/cli/config.full.toml index 7301afa50..64ddd20e9 100644 --- a/parity/cli/config.full.toml +++ b/parity/cli/config.full.toml @@ -52,6 +52,14 @@ cors = "null" apis = ["web3", "eth", "net", "parity", "traces", "rpc"] hosts = ["none"] +[websockets] +disable = false +port = 8546 +interface = "local" +origins = ["none"] +apis = ["web3", "eth", "net", "parity", "traces", "rpc"] +hosts = ["none"] + [ipc] disable = false path = "$HOME/.parity/jsonrpc.ipc" diff --git a/parity/cli/config.toml b/parity/cli/config.toml index b7f2936a1..b6695f3f5 100644 --- a/parity/cli/config.toml +++ b/parity/cli/config.toml @@ -24,6 +24,9 @@ allow_ips = "public" reserved_only = true reserved_peers = "./path/to/reserved_peers" +[websockets] +disable = true +origins = ["none"] [rpc] disable = true diff --git a/parity/cli/mod.rs b/parity/cli/mod.rs index 002ce6efb..ed1b6526f 100644 --- a/parity/cli/mod.rs +++ b/parity/cli/mod.rs @@ -170,6 +170,20 @@ usage! { flag_jsonrpc_threads: Option = None, or |c: &Config| otry!(c.rpc).threads.map(Some), + // WS + flag_no_ws: bool = false, + or |c: &Config| otry!(c.websockets).disable.clone(), + flag_ws_port: u16 = 8546u16, + or |c: &Config| otry!(c.websockets).port.clone(), + flag_ws_interface: String = "local", + or |c: &Config| otry!(c.websockets).interface.clone(), + flag_ws_apis: String = "web3,eth,net,parity,traces,rpc", + or |c: &Config| otry!(c.websockets).apis.as_ref().map(|vec| vec.join(",")), + flag_ws_origins: String = "none", + or |c: &Config| otry!(c.websockets).origins.as_ref().map(|vec| vec.join(",")), + flag_ws_hosts: String = "none", + or |c: &Config| otry!(c.websockets).hosts.as_ref().map(|vec| vec.join(",")), + // IPC flag_no_ipc: bool = false, or |c: &Config| otry!(c.ipc).disable.clone(), @@ -363,6 +377,7 @@ struct Config { ui: Option, network: Option, rpc: Option, + websockets: Option, ipc: Option, dapps: Option, secretstore: Option, @@ -440,6 +455,16 @@ struct Rpc { threads: Option, } +#[derive(Default, Debug, PartialEq, RustcDecodable)] +struct Ws { + disable: Option, + port: Option, + interface: Option, + apis: Option>, + origins: Option>, + hosts: Option>, +} + #[derive(Default, Debug, PartialEq, RustcDecodable)] struct Ipc { disable: Option, @@ -554,7 +579,7 @@ struct Misc { mod tests { use super::{ Args, ArgsError, - Config, Operating, Account, Ui, Network, Rpc, Ipc, Dapps, Ipfs, Mining, Footprint, + Config, Operating, Account, Ui, Network, Ws, Rpc, Ipc, Dapps, Ipfs, Mining, Footprint, Snapshots, VM, Misc, SecretStore, }; use toml; @@ -699,6 +724,14 @@ mod tests { flag_jsonrpc_hosts: "none".into(), flag_jsonrpc_threads: None, + // WS + flag_no_ws: false, + flag_ws_port: 8546u16, + flag_ws_interface: "local".into(), + flag_ws_apis: "web3,eth,net,parity,traces,rpc".into(), + flag_ws_origins: "none".into(), + flag_ws_hosts: "none".into(), + // IPC flag_no_ipc: false, flag_ipc_path: "$HOME/.parity/jsonrpc.ipc".into(), @@ -899,6 +932,14 @@ mod tests { reserved_only: Some(true), no_serve_light: None, }), + websockets: Some(Ws { + disable: Some(true), + port: None, + interface: None, + apis: None, + origins: Some(vec!["none".into()]), + hosts: None, + }), rpc: Some(Rpc { disable: Some(true), port: Some(8180), diff --git a/parity/cli/usage.txt b/parity/cli/usage.txt index 16f04e55e..17b6ce2b8 100644 --- a/parity/cli/usage.txt +++ b/parity/cli/usage.txt @@ -157,7 +157,28 @@ API and Console Options: vectors. Special options: "all", "none", (default: {flag_jsonrpc_hosts}). --jsonrpc-threads THREADS Enables experimental faster implementation of JSON-RPC server. - Requires Dapps server to be disabled using --no-dapps. (default: {flag_jsonrpc_threads:?}) + Requires Dapps server to be disabled + using --no-dapps. (default: {flag_jsonrpc_threads:?}) + + --no-ws Disable the WebSockets server. (default: {flag_no_ws}) + --ws-port PORT Specify the port portion of the WebSockets server + (default: {flag_ws_port}). + --ws-interface IP Specify the hostname portion of the WebSockets + server, IP should be an interface's IP address, or + all (all interfaces) or local (default: {flag_ws_interface}). + --ws-apis APIS Specify the APIs available through the WebSockets + interface. APIS is a comma-delimited list of API + name. Possible name are web3, eth, net, personal, + parity, parity_set, traces, rpc, parity_accounts. + (default: {flag_ws_apis}). + --ws-origins URL Specify Origin header values allowed to connect. + Special options: "all", "none". + (default: {flag_ws_origins}) + --ws-hosts HOSTS List of allowed Host header values. This option will + validate the Host header sent by the browser, it + is additional security against some attack + vectors. Special options: "all", "none", + (default: {flag_ws_hosts}). --no-ipc Disable JSON-RPC over IPC service. (default: {flag_no_ipc}) --ipc-path PATH Specify custom path for JSON-RPC over IPC service diff --git a/parity/configuration.rs b/parity/configuration.rs index fe26613d3..724633c28 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -30,9 +30,9 @@ use ethcore::client::{VMType}; use ethcore::miner::{MinerOptions, Banning, StratumOptions}; use ethcore::verification::queue::VerifierSettings; -use rpc::{IpcConfiguration, HttpConfiguration}; +use rpc::{IpcConfiguration, HttpConfiguration, WsConfiguration}; use rpc_apis::ApiSet; -use ethcore_rpc::NetworkSettings; +use parity_rpc::NetworkSettings; use cache::CacheConfig; use helpers::{to_duration, to_mode, to_block_id, to_u256, to_pending_set, to_price, replace_home, replace_home_for_db, geth_ipc_path, parity_ipc_path, to_bootnodes, to_addresses, to_address, to_gas_limit, to_queue_strategy}; @@ -114,6 +114,7 @@ impl Configuration { }; let update_policy = self.update_policy()?; let logger_config = self.logger_config(); + let ws_conf = self.ws_config()?; let http_conf = self.http_config()?; let ipc_conf = self.ipc_config()?; let net_conf = self.net_config()?; @@ -352,6 +353,7 @@ impl Configuration { daemon: daemon, logger_config: logger_config.clone(), miner_options: miner_options, + ws_conf: ws_conf, http_conf: http_conf, ipc_conf: ipc_conf, net_conf: net_conf, @@ -757,6 +759,14 @@ impl Configuration { Self::hosts(&self.args.flag_jsonrpc_hosts) } + fn ws_hosts(&self) -> Option> { + Self::hosts(&self.args.flag_ws_hosts) + } + + fn ws_origins(&self) -> Option> { + Self::hosts(&self.args.flag_ws_origins) + } + fn ipfs_hosts(&self) -> Option> { Self::hosts(&self.args.flag_ipfs_api_hosts) } @@ -801,6 +811,19 @@ impl Configuration { Ok(conf) } + fn ws_config(&self) -> Result { + let conf = WsConfiguration { + enabled: self.ws_enabled(), + interface: self.ws_interface(), + port: self.args.flag_ws_port, + apis: self.args.flag_ws_apis.parse()?, + hosts: self.ws_hosts(), + origins: self.ws_origins() + }; + + Ok(conf) + } + fn network_settings(&self) -> NetworkSettings { NetworkSettings { name: self.args.flag_identity.clone(), @@ -913,6 +936,10 @@ impl Configuration { Self::interface(&self.network_settings().rpc_interface) } + fn ws_interface(&self) -> String { + Self::interface(&self.args.flag_ws_interface) + } + fn ipfs_interface(&self) -> String { Self::interface(&self.args.flag_ipfs_api_interface) } @@ -965,6 +992,10 @@ impl Configuration { !self.args.flag_jsonrpc_off && !self.args.flag_no_jsonrpc } + fn ws_enabled(&self) -> bool { + !self.args.flag_no_ws + } + fn dapps_enabled(&self) -> bool { !self.args.flag_dapps_off && !self.args.flag_no_dapps && self.rpc_enabled() && cfg!(feature = "dapps") } @@ -1000,7 +1031,7 @@ impl Configuration { mod tests { use super::*; use cli::Args; - use ethcore_rpc::NetworkSettings; + use parity_rpc::NetworkSettings; use ethcore::client::{VMType, BlockId}; use ethcore::miner::{MinerOptions, PrioritizationStrategy}; use helpers::{default_network_config}; @@ -1204,6 +1235,7 @@ mod tests { daemon: None, logger_config: Default::default(), miner_options: Default::default(), + ws_conf: Default::default(), http_conf: Default::default(), ipc_conf: Default::default(), net_conf: default_network_config(), diff --git a/parity/dapps.rs b/parity/dapps.rs index 28264e270..b2dfe16d4 100644 --- a/parity/dapps.rs +++ b/parity/dapps.rs @@ -109,7 +109,7 @@ pub use self::server::{SyncStatus, Middleware, dapps_middleware}; mod server { use super::Dependencies; use std::path::PathBuf; - use ethcore_rpc::{hyper, RequestMiddleware, RequestMiddlewareAction}; + use parity_rpc::{hyper, RequestMiddleware, RequestMiddlewareAction}; pub type SyncStatus = Fn() -> bool; diff --git a/parity/informant.rs b/parity/informant.rs index 4145b0282..6b21eefc0 100644 --- a/parity/informant.rs +++ b/parity/informant.rs @@ -30,8 +30,8 @@ use ethcore::service::ClientIoMessage; use ethcore::snapshot::service::Service as SnapshotService; use ethcore::snapshot::{RestorationStatus, SnapshotService as SS}; use number_prefix::{binary_prefix, Standalone, Prefixed}; -use ethcore_rpc::{is_major_importing}; -use ethcore_rpc::informant::RpcStats; +use parity_rpc::{is_major_importing}; +use parity_rpc::informant::RpcStats; pub struct Informant { report: RwLock>, diff --git a/parity/main.rs b/parity/main.rs index 0d55055da..c61d414be 100644 --- a/parity/main.rs +++ b/parity/main.rs @@ -51,18 +51,18 @@ extern crate ethcore_ipc_hypervisor as hypervisor; extern crate ethcore_ipc_nano as nanoipc; extern crate ethcore_light as light; extern crate ethcore_logger; -extern crate ethcore_rpc; extern crate ethcore_signer; extern crate ethcore_util as util; extern crate ethkey; extern crate ethsync; extern crate parity_hash_fetch as hash_fetch; extern crate parity_ipfs_api; -extern crate parity_reactor; -extern crate parity_updater as updater; extern crate parity_local_store as local_store; -extern crate rpc_cli; +extern crate parity_reactor; +extern crate parity_rpc; +extern crate parity_updater as updater; extern crate path; +extern crate rpc_cli; #[macro_use] extern crate log as rlog; diff --git a/parity/rpc.rs b/parity/rpc.rs index 70a91c851..1fc503767 100644 --- a/parity/rpc.rs +++ b/parity/rpc.rs @@ -14,19 +14,20 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -use std::{io, fmt}; +use std::io; use std::sync::Arc; use dapps; use dir::default_data_path; -use ethcore_rpc::informant::{RpcStats, Middleware}; -use ethcore_rpc::{self as rpc, HttpServerError, Metadata, Origin, AccessControlAllowOrigin, Host}; +use parity_rpc::informant::{RpcStats, Middleware}; +use parity_rpc::{self as rpc, HttpServerError, Metadata, Origin, DomainsValidation}; use helpers::parity_ipc_path; use jsonrpc_core::MetaIoHandler; use parity_reactor::TokioRemote; use rpc_apis::{self, ApiSet}; -pub use ethcore_rpc::{IpcServer, HttpServer, RequestMiddleware}; +pub use parity_rpc::{IpcServer, HttpServer, RequestMiddleware}; +pub use parity_rpc::ws::Server as WsServer; #[derive(Debug, Clone, PartialEq)] pub struct HttpConfiguration { @@ -71,12 +72,25 @@ impl Default for IpcConfiguration { } } -impl fmt::Display for IpcConfiguration { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - if self.enabled { - write!(f, "endpoint address [{}], api list [{:?}]", self.socket_addr, self.apis) - } else { - write!(f, "disabled") +#[derive(Debug, PartialEq)] +pub struct WsConfiguration { + pub enabled: bool, + pub interface: String, + pub port: u16, + pub apis: ApiSet, + pub origins: Option>, + pub hosts: Option>, +} + +impl Default for WsConfiguration { + fn default() -> Self { + WsConfiguration { + enabled: true, + interface: "127.0.0.1".into(), + port: 8546, + apis: ApiSet::UnsafeContext, + origins: Some(Vec::new()), + hosts: Some(Vec::new()), } } } @@ -112,12 +126,71 @@ impl rpc::IpcMetaExtractor for RpcExtractor { } } +impl rpc::ws::MetaExtractor for RpcExtractor { + fn extract(&self, req: &rpc::ws::RequestContext) -> Metadata { + let mut metadata = Metadata::default(); + let id = req.session_id as u64; + metadata.origin = Origin::Ws(id.into()); + metadata + } +} + +struct WsStats { + stats: Arc, +} + +impl rpc::ws::SessionStats for WsStats { + fn open_session(&self, _id: rpc::ws::SessionId) { + self.stats.open_session() + } + + fn close_session(&self, _id: rpc::ws::SessionId) { + self.stats.close_session() + } +} + fn setup_apis(apis: ApiSet, deps: &Dependencies) -> MetaIoHandler> where D: rpc_apis::Dependencies { rpc_apis::setup_rpc(deps.stats.clone(), &*deps.apis, apis) } +pub fn new_ws( + conf: WsConfiguration, + deps: &Dependencies, +) -> Result, String> { + if !conf.enabled { + return Ok(None); + } + + let url = format!("{}:{}", conf.interface, conf.port); + let addr = url.parse().map_err(|_| format!("Invalid WebSockets listen host/port given: {}", url))?; + let handler = setup_apis(conf.apis, deps); + let remote = deps.remote.clone(); + let allowed_origins = into_domains(conf.origins); + let allowed_hosts = into_domains(conf.hosts); + + let start_result = rpc::start_ws( + &addr, + handler, + remote, + allowed_origins, + allowed_hosts, + RpcExtractor, + WsStats { + stats: deps.stats.clone(), + }, + ); + + match start_result { + Ok(server) => Ok(Some(server)), + Err(rpc::ws::Error::Io(ref err)) if err.kind() == io::ErrorKind::AddrInUse => Err( + format!("WebSockets address {} is already in use, make sure that another instance of an Ethereum client is not running or change the address using the --ws-port and --ws-interface options.", url) + ), + Err(e) => Err(format!("WebSockets error: {:?}", e)), + } +} + pub fn new_http( conf: HttpConfiguration, deps: &Dependencies, @@ -128,17 +201,17 @@ pub fn new_http( } let url = format!("{}:{}", conf.interface, conf.port); - let addr = url.parse().map_err(|_| format!("Invalid JSONRPC listen host/port given: {}", url))?; + let addr = url.parse().map_err(|_| format!("Invalid HTTP JSON-RPC listen host/port given: {}", url))?; let handler = setup_apis(conf.apis, deps); let remote = deps.remote.clone(); - let cors_domains: Option> = conf.cors.map(|domains| domains.into_iter().map(AccessControlAllowOrigin::from).collect()); - let allowed_hosts: Option> = conf.hosts.map(|hosts| hosts.into_iter().map(Host::from).collect()); + let cors_domains = into_domains(conf.cors); + let allowed_hosts = into_domains(conf.hosts); let start_result = rpc::start_http( &addr, - cors_domains.into(), - allowed_hosts.into(), + cors_domains, + allowed_hosts, handler, remote, RpcExtractor, @@ -153,16 +226,17 @@ pub fn new_http( match start_result { Ok(server) => Ok(Some(server)), - Err(HttpServerError::Io(err)) => match err.kind() { - io::ErrorKind::AddrInUse => Err( - format!("RPC address {} is already in use, make sure that another instance of an Ethereum client is not running or change the address using the --jsonrpc-port and --jsonrpc-interface options.", url) - ), - _ => Err(format!("RPC io error: {}", err)), - }, - Err(e) => Err(format!("RPC error: {:?}", e)), + Err(HttpServerError::Io(ref err)) if err.kind() == io::ErrorKind::AddrInUse => Err( + format!("HTTP address {} is already in use, make sure that another instance of an Ethereum client is not running or change the address using the --jsonrpc-port and --jsonrpc-interface options.", url) + ), + Err(e) => Err(format!("HTTP error: {:?}", e)), } } +fn into_domains>(items: Option>) -> DomainsValidation { + items.map(|vals| vals.into_iter().map(T::from).collect()).into() +} + pub fn new_ipc( conf: IpcConfiguration, dependencies: &Dependencies @@ -170,18 +244,19 @@ pub fn new_ipc( if !conf.enabled { return Ok(None); } + let handler = setup_apis(conf.apis, dependencies); let remote = dependencies.remote.clone(); match rpc::start_ipc(&conf.socket_addr, handler, remote, RpcExtractor) { Ok(server) => Ok(Some(server)), - Err(io_error) => Err(format!("RPC io error: {}", io_error)), + Err(io_error) => Err(format!("IPC error: {}", io_error)), } } #[cfg(test)] mod tests { use super::RpcExtractor; - use ethcore_rpc::{HttpMetaExtractor, Origin}; + use parity_rpc::{HttpMetaExtractor, Origin}; #[test] fn should_extract_rpc_origin() { diff --git a/parity/rpc_apis.rs b/parity/rpc_apis.rs index 538808909..15fe660b2 100644 --- a/parity/rpc_apis.rs +++ b/parity/rpc_apis.rs @@ -20,15 +20,15 @@ use std::collections::HashSet; use std::str::FromStr; use std::sync::Arc; -pub use ethcore_rpc::SignerService; +pub use parity_rpc::SignerService; use ethcore::account_provider::AccountProvider; use ethcore::client::Client; use ethcore::miner::{Miner, ExternalMiner}; use ethcore::snapshot::SnapshotService; -use ethcore_rpc::{Metadata, NetworkSettings}; -use ethcore_rpc::informant::{ActivityNotifier, Middleware, RpcStats, ClientNotifier}; -use ethcore_rpc::dispatch::{FullDispatcher, LightDispatcher}; +use parity_rpc::{Metadata, NetworkSettings}; +use parity_rpc::informant::{ActivityNotifier, Middleware, RpcStats, ClientNotifier}; +use parity_rpc::dispatch::{FullDispatcher, LightDispatcher}; use ethsync::{ManageNetwork, SyncProvider, LightSync}; use hash_fetch::fetch::Client as FetchClient; use jsonrpc_core::{MetaIoHandler}; @@ -203,7 +203,7 @@ impl Dependencies for FullDependencies { } fn extend_with_set(&self, handler: &mut MetaIoHandler, apis: &[Api]) { - use ethcore_rpc::v1::*; + use parity_rpc::v1::*; macro_rules! add_signing_methods { ($namespace:ident, $handler:expr, $deps:expr) => { @@ -331,7 +331,7 @@ impl Dependencies for LightDependencies { fn activity_notifier(&self) -> Self::Notifier { LightClientNotifier } fn extend_with_set(&self, handler: &mut MetaIoHandler>, apis: &[Api]) { - use ethcore_rpc::v1::*; + use parity_rpc::v1::*; let dispatcher = LightDispatcher::new( self.sync.clone(), diff --git a/parity/run.rs b/parity/run.rs index 70a23f934..a76c6a4ca 100644 --- a/parity/run.rs +++ b/parity/run.rs @@ -18,7 +18,7 @@ use std::sync::Arc; use std::net::{TcpListener}; use ctrlc::CtrlC; use fdlimit::raise_fd_limit; -use ethcore_rpc::{NetworkSettings, informant, is_major_importing}; +use parity_rpc::{NetworkSettings, informant, is_major_importing}; use ethsync::NetworkConfiguration; use util::{Colour, version, Mutex, Condvar}; use io::{MayPanic, ForwardPanic, PanicHandler}; @@ -80,6 +80,7 @@ pub struct RunCmd { pub daemon: Option, pub logger_config: LogConfig, pub miner_options: MinerOptions, + pub ws_conf: rpc::WsConfiguration, pub http_conf: rpc::HttpConfiguration, pub ipc_conf: rpc::IpcConfiguration, pub net_conf: NetworkConfiguration, @@ -295,7 +296,8 @@ fn execute_light(cmd: RunCmd, can_restart: bool, logger: Arc) -> }; // start rpc servers - let _http_server = rpc::new_http(cmd.http_conf, &dependencies, None)?; + let _ws_server = rpc::new_ws(cmd.ws_conf, &dependencies)?; + let _http_server = rpc::new_http(cmd.http_conf.clone(), &dependencies, None)?; let _ipc_server = rpc::new_ipc(cmd.ipc_conf, &dependencies)?; // the signer server @@ -636,6 +638,7 @@ pub fn execute(cmd: RunCmd, can_restart: bool, logger: Arc) -> R let dapps_middleware = dapps::new(cmd.dapps_conf.clone(), dapps_deps)?; // start rpc servers + let ws_server = rpc::new_ws(cmd.ws_conf, &dependencies)?; let http_server = rpc::new_http(cmd.http_conf.clone(), &dependencies, dapps_middleware)?; let ipc_server = rpc::new_ipc(cmd.ipc_conf, &dependencies)?; @@ -716,7 +719,7 @@ pub fn execute(cmd: RunCmd, can_restart: bool, logger: Arc) -> R let restart = wait_for_exit(panic_handler, Some(updater), Some(client), can_restart); // drop this stuff as soon as exit detected. - drop((http_server, ipc_server, signer_server, secretstore_key_server, ipfs_server, event_loop)); + drop((ws_server, http_server, ipc_server, signer_server, secretstore_key_server, ipfs_server, event_loop)); info!("Finishing work, please wait..."); diff --git a/parity/signer.rs b/parity/signer.rs index 29429311e..1ab53ea69 100644 --- a/parity/signer.rs +++ b/parity/signer.rs @@ -22,8 +22,8 @@ pub use ethcore_signer::Server as SignerServer; use ansi_term::Colour; use dir::default_data_path; -use ethcore_rpc::informant::RpcStats; -use ethcore_rpc::{self, ConfirmationsQueue}; +use parity_rpc::informant::RpcStats; +use parity_rpc::{self, ConfirmationsQueue}; use ethcore_signer as signer; use helpers::replace_home; use parity_reactor::TokioRemote; @@ -69,10 +69,10 @@ pub struct NewToken { #[derive(Debug, Default, Clone)] pub struct StandardExtractor; -impl signer::MetaExtractor for StandardExtractor { - fn extract_metadata(&self, session: &H256) -> ethcore_rpc::Metadata { - let mut metadata = ethcore_rpc::Metadata::default(); - metadata.origin = ethcore_rpc::Origin::Signer((*session).into()); +impl signer::MetaExtractor for StandardExtractor { + fn extract_metadata(&self, session: &H256) -> parity_rpc::Metadata { + let mut metadata = parity_rpc::Metadata::default(); + metadata.origin = parity_rpc::Origin::Signer((*session).into()); metadata } } diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 8b694b765..87e340b02 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] -description = "Ethcore jsonrpc" -name = "ethcore-rpc" +description = "Parity JSON-RPC servers." +name = "parity-rpc" version = "1.7.0" license = "GPL-3.0" authors = ["Parity Technologies "] @@ -25,6 +25,7 @@ rust-crypto = "0.2.36" jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-1.7" } jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-1.7" } jsonrpc-minihttp-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-1.7" } +jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-1.7" } jsonrpc-ipc-server = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-1.7" } jsonrpc-macros = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-1.7" } diff --git a/rpc/rpctest/Cargo.toml b/rpc/rpctest/Cargo.toml index 369de1c99..258af2f39 100644 --- a/rpc/rpctest/Cargo.toml +++ b/rpc/rpctest/Cargo.toml @@ -8,10 +8,10 @@ authors = ["Parity Technologies "] [dependencies] ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } docopt = "0.7" -rustc-serialize = "0.3" ethcore = { path = "../../ethcore" } ethcore-devtools = { path = "../../devtools" } -ethcore-rpc = { path = ".." } ethcore-util = { path = "../../util" } ethjson = { path = "../../json" } +parity-rpc = { path = ".." } +rustc-serialize = "0.3" serde_json = "0.8" diff --git a/rpc/rpctest/src/main.rs b/rpc/rpctest/src/main.rs index 6776a913a..d65d2462a 100644 --- a/rpc/rpctest/src/main.rs +++ b/rpc/rpctest/src/main.rs @@ -16,13 +16,13 @@ extern crate ctrlc; extern crate docopt; -extern crate rustc_serialize; -extern crate serde_json; -extern crate ethjson; -extern crate ethcore_util as util; extern crate ethcore; extern crate ethcore_devtools as devtools; -extern crate ethcore_rpc as rpc; +extern crate ethcore_util as util; +extern crate ethjson; +extern crate parity_rpc as rpc; +extern crate rustc_serialize; +extern crate serde_json; use std::collections::HashMap; use std::sync::{Arc, Mutex, Condvar}; diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs index 1d3f4285d..53b8f994c 100644 --- a/rpc/src/lib.rs +++ b/rpc/src/lib.rs @@ -66,6 +66,8 @@ extern crate ethjson; #[cfg(test)] extern crate ethcore_devtools as devtools; +pub extern crate jsonrpc_ws_server as ws; + mod metadata; pub mod v1; @@ -73,7 +75,7 @@ pub use ipc::{Server as IpcServer, MetaExtractor as IpcMetaExtractor, RequestCon pub use http::{ hyper, RequestMiddleware, RequestMiddlewareAction, - AccessControlAllowOrigin, Host, + AccessControlAllowOrigin, Host, DomainsValidation }; pub use v1::{SigningQueue, SignerService, ConfirmationsQueue, NetworkSettings, Metadata, Origin, informant, dispatch}; @@ -193,3 +195,28 @@ pub fn start_ipc( .session_metadata_extractor(extractor) .start(addr) } + +/// Start WS server and return `Server` handle. +pub fn start_ws( + addr: &SocketAddr, + handler: H, + remote: tokio_core::reactor::Remote, + allowed_origins: ws::DomainsValidation, + allowed_hosts: ws::DomainsValidation, + extractor: T, + stats: U, +) -> Result where + M: jsonrpc_core::Metadata, + S: jsonrpc_core::Middleware, + H: Into>, + T: ws::MetaExtractor, + U: ws::SessionStats, +{ + ws::ServerBuilder::new(handler) + .event_loop_remote(remote) + .allowed_origins(allowed_origins) + .allowed_hosts(allowed_hosts) + .session_meta_extractor(extractor) + .session_stats(stats) + .start(addr) +} diff --git a/rpc/src/v1/types/provenance.rs b/rpc/src/v1/types/provenance.rs index 1e014dd5f..81201f8e4 100644 --- a/rpc/src/v1/types/provenance.rs +++ b/rpc/src/v1/types/provenance.rs @@ -33,6 +33,9 @@ pub enum Origin { /// IPC server (includes session hash) #[serde(rename="ipc")] Ipc(H256), + /// WS server (includes session hash) + #[serde(rename="ws")] + Ws(H256), /// Signer (includes session hash) #[serde(rename="signer")] Signer(H256), @@ -53,6 +56,7 @@ impl fmt::Display for Origin { Origin::Rpc(ref origin) => write!(f, "RPC (service: {})", origin), Origin::Dapps(ref origin) => write!(f, "Dapp {}", origin), Origin::Ipc(ref session) => write!(f, "IPC (session: {})", session), + Origin::Ws(ref session) => write!(f, "WebSocket (session: {})", session), Origin::Signer(ref session) => write!(f, "UI (session: {})", session), Origin::Unknown => write!(f, "unknown origin"), } @@ -112,6 +116,7 @@ mod tests { let o3 = Origin::Ipc(5.into()); let o4 = Origin::Signer(10.into()); let o5 = Origin::Unknown; + let o6 = Origin::Ws(5.into()); // when let res1 = serde_json::to_string(&o1).unwrap(); @@ -119,6 +124,7 @@ mod tests { let res3 = serde_json::to_string(&o3).unwrap(); let res4 = serde_json::to_string(&o4).unwrap(); let res5 = serde_json::to_string(&o5).unwrap(); + let res6 = serde_json::to_string(&o6).unwrap(); // then assert_eq!(res1, r#"{"rpc":"test service"}"#); @@ -126,6 +132,7 @@ mod tests { assert_eq!(res3, r#"{"ipc":"0x0000000000000000000000000000000000000000000000000000000000000005"}"#); assert_eq!(res4, r#"{"signer":"0x000000000000000000000000000000000000000000000000000000000000000a"}"#); assert_eq!(res5, r#""unknown""#); + assert_eq!(res6, r#"{"ws":"0x0000000000000000000000000000000000000000000000000000000000000005"}"#); } #[test] diff --git a/rpc_cli/Cargo.toml b/rpc_cli/Cargo.toml index 8169d3b71..bb3588015 100644 --- a/rpc_cli/Cargo.toml +++ b/rpc_cli/Cargo.toml @@ -10,6 +10,6 @@ version = "1.4.0" futures = "0.1" rpassword = "0.3.0" ethcore-bigint = { path = "../util/bigint" } -ethcore-rpc = { path = "../rpc" } +parity-rpc = { path = "../rpc" } parity-rpc-client = { path = "../rpc_client" } ethcore-util = { path = "../util" } diff --git a/rpc_cli/src/lib.rs b/rpc_cli/src/lib.rs index 0cfb54353..8d00405b5 100644 --- a/rpc_cli/src/lib.rs +++ b/rpc_cli/src/lib.rs @@ -1,10 +1,10 @@ extern crate futures; - -extern crate ethcore_util as util; -extern crate ethcore_rpc as rpc; -extern crate ethcore_bigint as bigint; extern crate rpassword; +extern crate ethcore_util as util; +extern crate ethcore_bigint as bigint; + +extern crate parity_rpc as rpc; extern crate parity_rpc_client as client; use rpc::v1::types::{U256, ConfirmationRequest}; diff --git a/rpc_client/Cargo.toml b/rpc_client/Cargo.toml index 7b6be3bb2..c4e68acef 100644 --- a/rpc_client/Cargo.toml +++ b/rpc_client/Cargo.toml @@ -16,6 +16,6 @@ tempdir = "0.3.5" url = "1.2.0" jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch = "parity-1.7" } ws = { git = "https://github.com/paritytech/ws-rs.git", branch = "parity-1.7" } -ethcore-rpc = { path = "../rpc" } +parity-rpc = { path = "../rpc" } ethcore-signer = { path = "../signer" } ethcore-util = { path = "../util" } diff --git a/rpc_client/src/lib.rs b/rpc_client/src/lib.rs index 7bc265250..e2f53e606 100644 --- a/rpc_client/src/lib.rs +++ b/rpc_client/src/lib.rs @@ -1,17 +1,17 @@ pub mod client; pub mod signer_client; -extern crate ws; extern crate ethcore_signer; -extern crate url; -extern crate futures; extern crate ethcore_util as util; -extern crate ethcore_rpc as rpc; +extern crate futures; +extern crate jsonrpc_core; +extern crate parity_rpc as rpc; +extern crate rand; extern crate serde; extern crate serde_json; -extern crate rand; extern crate tempdir; -extern crate jsonrpc_core; +extern crate url; +extern crate ws; #[macro_use] extern crate log; diff --git a/scripts/targets.sh b/scripts/targets.sh index 040485d85..f3ae6a2d5 100644 --- a/scripts/targets.sh +++ b/scripts/targets.sh @@ -6,7 +6,7 @@ export TARGETS=" -p ethcore \ -p ethcore-bigint\ -p parity-dapps \ - -p ethcore-rpc \ + -p parity-rpc \ -p ethcore-signer \ -p ethcore-util \ -p ethcore-network \ diff --git a/signer/Cargo.toml b/signer/Cargo.toml index bed1c461a..4f7c0f179 100644 --- a/signer/Cargo.toml +++ b/signer/Cargo.toml @@ -20,7 +20,7 @@ ws = { git = "https://github.com/paritytech/ws-rs.git", branch = "parity-1.7" } parity-dapps-glue = { version = "1.7", optional = true } ethcore-util = { path = "../util" } ethcore-io = { path = "../util/io" } -ethcore-rpc = { path = "../rpc" } +parity-rpc = { path = "../rpc" } ethcore-devtools = { path = "../devtools" } parity-ui = { path = "../dapps/ui", version = "1.4", optional = true } diff --git a/signer/src/lib.rs b/signer/src/lib.rs index d211e2eac..a1c935c5b 100644 --- a/signer/src/lib.rs +++ b/signer/src/lib.rs @@ -32,13 +32,13 @@ //! extern crate jsonrpc_core; //! extern crate jsonrpc_server_utils; //! extern crate ethcore_signer; -//! extern crate ethcore_rpc; +//! extern crate parity_rpc; //! //! use std::sync::Arc; //! use jsonrpc_core::IoHandler; //! use jsonrpc_server_utils::reactor::RpcEventLoop; //! use ethcore_signer::ServerBuilder; -//! use ethcore_rpc::ConfirmationsQueue; +//! use parity_rpc::ConfirmationsQueue; //! //! fn main() { //! let queue = Arc::new(ConfirmationsQueue::default()); @@ -55,11 +55,11 @@ extern crate log; extern crate env_logger; extern crate rand; -extern crate ethcore_util as util; -extern crate ethcore_rpc as rpc; extern crate ethcore_io as io; +extern crate ethcore_util as util; extern crate jsonrpc_core; extern crate jsonrpc_server_utils; +extern crate parity_rpc as rpc; extern crate ws; extern crate ethcore_devtools as devtools;