diff --git a/webapp/src/router/api.rs b/webapp/src/router/api.rs new file mode 100644 index 000000000..1044af407 --- /dev/null +++ b/webapp/src/router/api.rs @@ -0,0 +1,53 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Simple REST API + +use std::sync::Arc; +use hyper; +use hyper::status::StatusCode; +use hyper::header; +use hyper::uri::RequestUri::AbsolutePath as Path; +use apps::Pages; + +pub struct RestApi { + pub pages: Arc, +} + +impl RestApi { + fn list_pages(&self) -> String { + let mut s = "[".to_owned(); + for name in self.pages.keys() { + s.push_str(&format!("\"{}\",", name)); + } + s.push_str("\"rpc\""); + s.push_str("]"); + s + } +} + +impl hyper::server::Handler for RestApi { + fn handle<'b, 'a>(&'a self, req: hyper::server::Request<'a, 'b>, mut res: hyper::server::Response<'a>) { + match req.uri { + Path(ref path) if path == "apps" => { + *res.status_mut() = StatusCode::Ok; + res.headers_mut().set(header::ContentType("application/json".parse().unwrap())); + let _ = res.send(self.list_pages().as_bytes()); + }, + _ => () + } + } +} diff --git a/webapp/src/router/mod.rs b/webapp/src/router/mod.rs index fad8593b9..f0399aba8 100644 --- a/webapp/src/router/mod.rs +++ b/webapp/src/router/mod.rs @@ -16,16 +16,20 @@ //! Router implementation +use std::sync::Arc; use hyper; use page::Page; use apps::Pages; use iron::request::Url; use jsonrpc_http_server::ServerHandler; +mod api; + pub struct Router { rpc: ServerHandler, + api: api::RestApi, main_page: Box, - pages: Pages, + pages: Arc, } impl hyper::server::Handler for Router { @@ -34,7 +38,10 @@ impl hyper::server::Handler for Router { match path { Some(ref url) if self.pages.contains_key(url) => { self.pages.get(url).unwrap().handle(req, res); - } + }, + Some(ref url) if url == "api" => { + self.api.handle(req, res); + }, _ if req.method == hyper::method::Method::Post => { self.rpc.handle(req, res) }, @@ -45,8 +52,10 @@ impl hyper::server::Handler for Router { impl Router { pub fn new(rpc: ServerHandler, main_page: Box, pages: Pages) -> Self { + let pages = Arc::new(pages); Router { rpc: rpc, + api: api::RestApi { pages: pages.clone() }, main_page: main_page, pages: pages, }