diff --git a/api/src/handlers.rs b/api/src/handlers.rs index 1bd37dc8c..9d8f6395f 100644 --- a/api/src/handlers.rs +++ b/api/src/handlers.rs @@ -257,15 +257,14 @@ impl Handler for PeersConnectedHandler { } } -/// Get details about a given peer and peer operations -/// TODO GET /v1/peers/10.12.12.13 +/// Peer operations /// POST /v1/peers/10.12.12.13/ban /// TODO POST /v1/peers/10.12.12.13/unban -pub struct PeerHandler { +pub struct PeerPostHandler { pub peers: p2p::Peers, } -impl Handler for PeerHandler { +impl Handler for PeerPostHandler { fn handle(&self, req: &mut Request) -> IronResult { let url = req.url.clone(); let mut path_elems = url.path(); @@ -294,6 +293,29 @@ impl Handler for PeerHandler { } } +/// Get details about a given peer +pub struct PeerGetHandler { + pub peers: p2p::Peers, +} + +impl Handler for PeerGetHandler { + fn handle(&self, req: &mut Request) -> IronResult { + let url = req.url.clone(); + let mut path_elems = url.path(); + if *path_elems.last().unwrap() == "" { + path_elems.pop(); + } + if let Ok(addr) = path_elems.last().unwrap().parse() { + match self.peers.get_peer(addr) { + Ok(peer) => json_response(&peer), + Err(_) => Ok(Response::with((status::BadRequest, ""))), + } + } else { + Ok(Response::with((status::BadRequest, ""))) + } + } +} + // Chain handler. Get the head details. // GET /v1/chain pub struct ChainHandler { @@ -491,7 +513,10 @@ let _ = thread::Builder::new() let peers_connected_handler = PeersConnectedHandler { peers: peers.clone(), }; - let peer_handler = PeerHandler { + let peer_post_handler = PeerPostHandler { + peers: peers.clone(), + }; + let peer_get_handler = PeerGetHandler { peers: peers.clone(), }; @@ -508,6 +533,7 @@ let _ = thread::Builder::new() "post peers/a.b.c.d:p/ban".to_string(), "get peers/all".to_string(), "get peers/connected".to_string(), + "get peers/a.b.c.d".to_string(), ); // We allow manually banning, like this: // curl -v -X POST http://127.0.0.1:13413/v1/peers/88.99.251.87:13414/ban @@ -522,7 +548,8 @@ let _ = thread::Builder::new() pool_push: post "/pool/push" => pool_push_handler, peers_all: get "/peers/all" => peers_all_handler, peers_connected: get "/peers/connected" => peers_connected_handler, - peer: post "/peers/*" => peer_handler, + peer: post "/peers/*" => peer_post_handler, + peer: get "/peers/*" => peer_get_handler ); let mut apis = ApiServer::new("/v1".to_string()); diff --git a/p2p/src/peers.rs b/p2p/src/peers.rs index 5bb162a07..55b94769a 100644 --- a/p2p/src/peers.rs +++ b/p2p/src/peers.rs @@ -70,7 +70,7 @@ impl Peers { } pub fn is_known(&self, addr: &SocketAddr) -> bool { - self.get_peer(addr).is_some() + self.get_connected_peer(addr).is_some() } /// Get vec of peers we are currently connected to. @@ -81,7 +81,7 @@ impl Peers { } /// Get a peer we're connected to by address. - pub fn get_peer(&self, addr: &SocketAddr) -> Option>> { + pub fn get_connected_peer(&self, addr: &SocketAddr) -> Option>> { self.peers.read().unwrap().get(addr).map(|p| p.clone()) } @@ -185,7 +185,7 @@ impl Peers { error!(LOGGER, "Couldn't ban {}: {:?}", peer_addr, e); } - if let Some(peer) = self.get_peer(peer_addr) { + if let Some(peer) = self.get_connected_peer(peer_addr) { debug!(LOGGER, "Banning peer {}", peer_addr); // setting peer status will get it removed at the next clean_peer let peer = peer.write().unwrap(); @@ -262,6 +262,11 @@ impl Peers { self.store.find_peers(state, cap, count) } + /// Get peer in store by address + pub fn get_peer(&self, peer_addr: SocketAddr) -> Result { + self.store.get_peer(peer_addr).map_err(From::from) + } + /// Whether we've already seen a peer with the provided address pub fn exists_peer(&self, peer_addr: SocketAddr) -> Result { self.store.exists_peer(peer_addr).map_err(From::from) @@ -415,7 +420,7 @@ impl NetAdapter for Peers { ); if diff.into_num() > 0 { - if let Some(peer) = self.get_peer(&addr) { + if let Some(peer) = self.get_connected_peer(&addr) { let mut peer = peer.write().unwrap(); peer.info.total_difficulty = diff; } diff --git a/p2p/src/server.rs b/p2p/src/server.rs index 3b4e15a77..d35604104 100644 --- a/p2p/src/server.rs +++ b/p2p/src/server.rs @@ -216,7 +216,7 @@ impl Server { h: reactor::Handle, ) -> Box>>, Error = Error>> { - if let Some(p) = self.peers.get_peer(&addr) { + if let Some(p) = self.peers.get_connected_peer(&addr) { // if we're already connected to the addr, just return the peer debug!(LOGGER, "connect_peer: already connected {}", addr); return Box::new(future::ok(Some(p)));