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,
}