encryption/integrations/
warp.rs1use std::convert::Infallible;
26
27use warp::Filter;
28
29use crate::guard::Guard;
30
31pub fn with_guard(guard: Guard) -> impl Filter<Extract = (Guard,), Error = Infallible> + Clone {
35 warp::any().map(move || guard.clone())
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41 use warp::Filter;
42
43 fn guard() -> Guard {
44 Guard::from_master_key(&[7u8; 32], "aes-256-gcm").unwrap()
45 }
46
47 #[tokio::test]
48 async fn filter_yields_the_guard() {
49 let route = warp::any()
50 .and(with_guard(guard()))
51 .map(|g: Guard| g.identifiers().len().to_string());
52
53 let value = warp::test::request().filter(&route).await.unwrap();
54 assert_eq!(value, "5");
55 }
56
57 #[tokio::test]
59 async fn handler_and_state_share_one_encrypter() {
60 let state = guard();
61 let token = state.encrypt("共享".as_bytes()).unwrap();
62
63 let route = warp::any().and(with_guard(guard())).map(move |g: Guard| {
64 g.decrypt(&token)
65 .map(|plain| String::from_utf8_lossy(&plain).into_owned())
66 .unwrap_or_else(|_| "解不开".into())
67 });
68
69 let value = warp::test::request().filter(&route).await.unwrap();
70 assert_eq!(value, "共享");
71 }
72
73 #[tokio::test]
75 async fn filter_is_cloneable_and_reusable() {
76 let filter = with_guard(guard());
77 let a = filter.clone();
78 let b = filter;
79
80 let route_a = warp::any().and(a).map(|g: Guard| g.identifiers().len());
81 let route_b = warp::any().and(b).map(|g: Guard| g.identifiers().len());
82
83 assert_eq!(warp::test::request().filter(&route_a).await.unwrap(), 5);
84 assert_eq!(warp::test::request().filter(&route_b).await.unwrap(), 5);
85 }
86}