diff --git a/src/main.rs b/src/main.rs index 51d9ecb..43b21ab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,6 +20,7 @@ mod webservice; use asns::*; use clap::{Arg, App}; +use std::sync::{Arc, RwLock}; use webservice::*; fn logger_init() { @@ -65,6 +66,7 @@ fn main() { Ok(asns) => asns, Err(err) => panic!(format!("{} [{}]", err, db_url)), }; + let asns_arc = RwLock::new(Arc::new(asns)); info!("Starting the webservice"); - WebService::start(asns, listen_addr); + WebService::start(asns_arc, listen_addr); } diff --git a/src/webservice.rs b/src/webservice.rs index 5d4fb6d..78b08d5 100644 --- a/src/webservice.rs +++ b/src/webservice.rs @@ -9,12 +9,12 @@ use router::Router; use serde_json; use std::net::IpAddr; use std::str::FromStr; -use std::sync::Arc; +use std::sync::{Arc, RwLock}; const TTL: u32 = 86400; struct ASNsMiddleware { - asns: Arc, + asns_arc: RwLock>, } impl typemap::Key for ASNsMiddleware { @@ -22,14 +22,14 @@ impl typemap::Key for ASNsMiddleware { } impl ASNsMiddleware { - fn new(asns: ASNs) -> ASNsMiddleware { - ASNsMiddleware { asns: Arc::new(asns) } + fn new(asns_arc: RwLock>) -> ASNsMiddleware { + ASNsMiddleware { asns_arc: asns_arc } } } impl BeforeMiddleware for ASNsMiddleware { fn before(&self, req: &mut Request) -> IronResult<()> { - req.extensions.insert::(self.asns.clone()); + req.extensions.insert::(self.asns_arc.read().unwrap().clone()); Ok(()) } } @@ -101,11 +101,11 @@ impl WebService { Ok(Response::with((status::Ok, mime_json, cache_header, json))) } - pub fn start(asns: ASNs, listen_addr: &str) { + pub fn start(asns_arc: RwLock>, listen_addr: &str) { let router = router!(index: get "/" => Self::index, ip_lookup: get "/v1/as/ip/:ip" => Self::ip_lookup); let mut chain = Chain::new(router); - let asns_middleware = ASNsMiddleware::new(asns); + let asns_middleware = ASNsMiddleware::new(asns_arc); chain.link_before(asns_middleware); warn!("webservice ready"); Iron::new(chain).http(listen_addr).unwrap();