Remove Iron dependency and update hyper to version 0.12 (#1241)
* Remove Iron dependecy and update hyper to version 0.12 #876 * REMOVE ME * Revert "REMOVE ME" This reverts commit e9a976eee98a2d5a4dfae5d9e1e4f5ed640c05d3. * Rebase and start updating libwallet Libwallet doesn't compile yet. * Wallet compiles * Grin compiles * No compilation errors in tests * All tests pass * Reeturn future from handler * Refactoring * Fix lifetime issue one more time I have to force push to rollback all the work done in last 2 days * Fix wallet send issue * Clean up
This commit is contained in:
+31
-38
@@ -18,20 +18,17 @@
|
||||
//! To use it, just have your service(s) implement the ApiEndpoint trait and
|
||||
//! register them on a ApiServer.
|
||||
|
||||
use hyper::rt::Future;
|
||||
use hyper::service::service_fn;
|
||||
use hyper::{Body, Request, Server};
|
||||
use router::ResponseFuture;
|
||||
use std::fmt::{self, Display};
|
||||
use std::mem;
|
||||
use std::net::ToSocketAddrs;
|
||||
use std::string::ToString;
|
||||
use std::net::SocketAddr;
|
||||
use tokio::runtime::current_thread::Runtime;
|
||||
|
||||
use failure::{Backtrace, Context, Fail};
|
||||
use iron::Listening;
|
||||
use iron::middleware::Handler;
|
||||
use iron::prelude::Iron;
|
||||
use mount::Mount;
|
||||
use router::Router;
|
||||
|
||||
/// Errors that can be returned by an ApiEndpoint implementation.
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Error {
|
||||
inner: Context<ErrorKind>,
|
||||
@@ -45,6 +42,10 @@ pub enum ErrorKind {
|
||||
Argument(String),
|
||||
#[fail(display = "Not found.")]
|
||||
NotFound,
|
||||
#[fail(display = "Request error: {}", _0)]
|
||||
RequestError(String),
|
||||
#[fail(display = "ResponseError error: {}", _0)]
|
||||
ResponseError(String),
|
||||
}
|
||||
|
||||
impl Fail for Error {
|
||||
@@ -84,45 +85,37 @@ impl From<Context<ErrorKind>> for Error {
|
||||
}
|
||||
|
||||
/// HTTP server allowing the registration of ApiEndpoint implementations.
|
||||
pub struct ApiServer {
|
||||
root: String,
|
||||
router: Router,
|
||||
mount: Mount,
|
||||
server_listener: Option<Listening>,
|
||||
}
|
||||
pub struct ApiServer {}
|
||||
|
||||
impl ApiServer {
|
||||
/// Creates a new ApiServer that will serve ApiEndpoint implementations
|
||||
/// under the root URL.
|
||||
pub fn new(root: String) -> ApiServer {
|
||||
ApiServer {
|
||||
root: root,
|
||||
router: Router::new(),
|
||||
mount: Mount::new(),
|
||||
server_listener: None,
|
||||
}
|
||||
pub fn new() -> ApiServer {
|
||||
ApiServer {}
|
||||
}
|
||||
|
||||
/// Starts the ApiServer at the provided address.
|
||||
pub fn start<A: ToSocketAddrs>(&mut self, addr: A) -> Result<(), String> {
|
||||
// replace this value to satisfy borrow checker
|
||||
let r = mem::replace(&mut self.router, Router::new());
|
||||
let mut m = mem::replace(&mut self.mount, Mount::new());
|
||||
m.mount("/", r);
|
||||
let result = Iron::new(m).http(addr);
|
||||
let return_value = result.as_ref().map(|_| ()).map_err(|e| e.to_string());
|
||||
self.server_listener = Some(result.unwrap());
|
||||
return_value
|
||||
pub fn start<F>(&mut self, addr: SocketAddr, f: &'static F) -> Result<(), String>
|
||||
where
|
||||
F: Fn(Request<Body>) -> ResponseFuture + Send + Sync + 'static,
|
||||
{
|
||||
let server = Server::bind(&addr)
|
||||
.serve(move || service_fn(f))
|
||||
.map_err(|e| eprintln!("server error: {}", e));
|
||||
|
||||
let mut rt = Runtime::new().unwrap();
|
||||
if rt.block_on(server).is_err() {
|
||||
return Err("tokio block_on error".to_owned());
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Stops the API server
|
||||
pub fn stop(&mut self) {
|
||||
let r = mem::replace(&mut self.server_listener, None);
|
||||
r.unwrap().close().unwrap();
|
||||
}
|
||||
|
||||
/// Registers an iron handler (via mount)
|
||||
pub fn register_handler<H: Handler>(&mut self, handler: H) -> &mut Mount {
|
||||
self.mount.mount(&self.root, handler)
|
||||
// TODO implement proper stop, the following method doesn't
|
||||
// work for current_thread runtime.
|
||||
// if let Some(rt) = self.rt.take() {
|
||||
// rt.shutdown_now().wait().unwrap();
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user