diff options
-rw-r--r-- | Cargo.lock | 1 | ||||
-rw-r--r-- | angelsharkd/Cargo.toml | 6 | ||||
-rw-r--r-- | angelsharkd/src/routes/extensions/mod.rs | 10 | ||||
-rw-r--r-- | angelsharkd/src/routes/extensions/simple_search.rs | 43 |
4 files changed, 30 insertions, 30 deletions
@@ -30,7 +30,6 @@ dependencies = [ "env_logger", "libangelshark", "log", - "once_cell", "serde", "tokio", "warp", diff --git a/angelsharkd/Cargo.toml b/angelsharkd/Cargo.toml index d532bf9..9fdb00c 100644 --- a/angelsharkd/Cargo.toml +++ b/angelsharkd/Cargo.toml @@ -6,7 +6,7 @@ authors = ["Adam T. Carpenter <adam.carpenter@adp.com>"] description = "A HTTP interface into one or more Communication Managers" [features] -simple_search = ["once_cell"] +simple_search = [] simple_deprov = [] [dependencies.libangelshark] @@ -32,7 +32,3 @@ features = ["derive"] [dependencies.anyhow] version = "1" - -[dependencies.once_cell] -optional = true -version = "1"
\ No newline at end of file diff --git a/angelsharkd/src/routes/extensions/mod.rs b/angelsharkd/src/routes/extensions/mod.rs index 5628588..b1c5aa3 100644 --- a/angelsharkd/src/routes/extensions/mod.rs +++ b/angelsharkd/src/routes/extensions/mod.rs @@ -1,3 +1,5 @@ +use std::sync::{Arc, Mutex}; + use crate::config::Config; use warp::{path, Filter, Rejection, Reply}; @@ -13,9 +15,13 @@ pub fn filter(config: &Config) -> impl Filter<Extract = impl Reply, Error = Reje let filters = default().or(default()); #[cfg(feature = "simple_search")] + let runner = config.runner.clone(); + #[cfg(feature = "simple_search")] + let haystack = simple_search::Haystack::new(); + #[cfg(feature = "simple_search")] let filters = filters - .or(simple_search::search(config)) - .or(simple_search::refresh(config)); + .or(simple_search::search(haystack.clone())) + .or(simple_search::refresh(runner, haystack)); #[cfg(feature = "simple_deprov")] let filters = filters.or(simple_deprov::filter()); diff --git a/angelsharkd/src/routes/extensions/simple_search.rs b/angelsharkd/src/routes/extensions/simple_search.rs index a92c47c..7b547d3 100644 --- a/angelsharkd/src/routes/extensions/simple_search.rs +++ b/angelsharkd/src/routes/extensions/simple_search.rs @@ -1,6 +1,4 @@ -use crate::{config::Config, routes::with_runner}; use libangelshark::AcmRunner; -use once_cell::sync::Lazy; use std::{ convert::Infallible, sync::{Arc, Mutex}, @@ -10,55 +8,56 @@ use warp::{ get, path, post, Filter, Rejection, Reply, }; -static HAYSTACK_CACHE: Lazy<Haystack> = Lazy::new(Haystack::new); - /// Collection of search terms type Needle = Vec<String>; -pub fn search(config: &Config) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { - let runner = config.runner.clone(); - // TODO: anti-caching headers on resp? +pub fn search(haystack: Haystack) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { + // TODO: discourage caching response thru headers path("search") .and(post()) .and(content_length_limit(1024 * 16)) - .and(json::<Needle>()) - .and(with_runner(runner)) - .and_then(handle_search) + .and(json()) + .and_then(move |terms: Needle| handle_search(haystack.clone(), terms)) } -pub fn refresh(config: &Config) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { - let runner = config.runner.clone(); +pub fn refresh( + runner: AcmRunner, + haystack: Haystack, +) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { path!("search" / "refresh") .and(get()) - .and(with_runner(runner)) - .and_then(handle_refresh) + .and_then(move || handle_refresh(haystack.clone(), runner.clone())) } -async fn handle_search(terms: Needle, runner: AcmRunner) -> Result<impl Reply, Infallible> { - HAYSTACK_CACHE.search(Vec::new()); - Ok("") +async fn handle_search(haystack: Haystack, needle: Needle) -> Result<impl Reply, Infallible> { + Ok(haystack.search(Vec::new())) } -async fn handle_refresh(runner: AcmRunner) -> Result<impl Reply, Infallible> { - HAYSTACK_CACHE.refresh(); +async fn handle_refresh(haystack: Haystack, runner: AcmRunner) -> Result<impl Reply, Infallible> { + haystack.refresh(); Ok("Refresh scheduled") } /// A lazy-loaded, asynchronously-refreshed exension-type haystack cache. -struct Haystack { +#[derive(Clone)] +pub struct Haystack { inner: Arc<Mutex<String>>, } impl Haystack { - fn new() -> Self { + pub fn new() -> Self { Self { inner: Arc::new(Mutex::new(String::with_capacity(0))), } } pub fn search(&self, needle: Needle) -> String { - (*self.inner.lock().unwrap()).clone() + if let Ok(matches) = self.inner.lock() { + matches.clone() + } else { + String::from("stale") + } } pub fn refresh(&self) { |