1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
use std::net::SocketAddr; use std::sync::Arc; use rpc_apis::{self, ApiSet}; use ethcore_rpc::{Server, start_http, MetaIoHandler, Compatibility, Remote}; use network::Network; use std::io; use sync; use storage; use p2p; pub struct Dependencies { pub network: Network, pub local_sync_node: sync::LocalNodeRef, pub storage: storage::SharedStore, pub p2p_context: Arc<p2p::Context>, pub remote: Remote, } #[derive(Debug, PartialEq)] pub struct HttpConfiguration { pub enabled: bool, pub interface: String, pub port: u16, pub apis: ApiSet, pub cors: Option<Vec<String>>, pub hosts: Option<Vec<String>>, } impl HttpConfiguration { pub fn with_port(port: u16) -> Self { HttpConfiguration { enabled: true, interface: "127.0.0.1".into(), port: port, apis: ApiSet::default(), cors: None, hosts: Some(Vec::new()), } } } pub fn new_http(conf: HttpConfiguration, deps: Dependencies) -> Result<Option<Server>, String> { if !conf.enabled { return Ok(None); } let url = format!("{}:{}", conf.interface, conf.port); let addr = try!(url.parse().map_err(|_| format!("Invalid JSONRPC listen host/port given: {}", url))); Ok(Some(try!(setup_http_rpc_server(&addr, conf.cors, conf.hosts, conf.apis, deps)))) } pub fn setup_http_rpc_server( url: &SocketAddr, cors_domains: Option<Vec<String>>, allowed_hosts: Option<Vec<String>>, apis: ApiSet, deps: Dependencies, ) -> Result<Server, String> { let server = setup_rpc_server(apis, deps); let start_result = start_http(url, cors_domains, allowed_hosts, server); match start_result { Err(ref err) if err.kind() == io::ErrorKind::AddrInUse => { Err(format!("RPC address {} is already in use, make sure that another instance of a Bitcoin node is not running or change the address using the --jsonrpc-port and --jsonrpc-interface options.", url)) }, Err(e) => Err(format!("RPC error: {:?}", e)), Ok(server) => Ok(server), } } fn setup_rpc_server(apis: ApiSet, deps: Dependencies) -> MetaIoHandler<()> { rpc_apis::setup_rpc(MetaIoHandler::with_compatibility(Compatibility::Both), apis, deps) }