use std::sync::Arc;
use rainier_middleware::{
AddHeaders, ConvertEmptyStringsToNull, HandleCors, MiddlewareStack, ThrottleRequests,
TrimStrings, TrustProxies,
};
use rainier_session::{SessionManager, StartSession};
pub fn web() -> MiddlewareStack {
MiddlewareStack::new().with(AddHeaders::security_defaults()).with_stack(session())
}
pub fn api() -> MiddlewareStack {
api_throttled(60)
}
pub fn api_throttled(per_minute: u32) -> MiddlewareStack {
MiddlewareStack::new()
.with(HandleCors::any_origin())
.with(ThrottleRequests::per_minute(per_minute))
}
pub fn session() -> MiddlewareStack {
MiddlewareStack::new()
.resolved(|manager: Arc<SessionManager>| StartSession::from_manager(&manager))
}
pub fn normalise_input() -> MiddlewareStack {
MiddlewareStack::new().with(TrimStrings::new()).with(ConvertEmptyStringsToNull)
}
pub fn trust_local_proxies() -> MiddlewareStack {
MiddlewareStack::new().with(TrustProxies::these([
"127.0.0.0/8",
"::1",
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
"fd00::/8",
]))
}
#[cfg(test)]
mod tests {
use super::*;
use rainier_container::Container;
use rainier_session::MemorySessionStore;
#[test]
fn web_is_security_headers_and_a_session() {
assert_eq!(web().labels(), vec!["AddHeaders", "StartSession"]);
}
#[test]
fn api_has_no_session() {
assert!(!api().labels().contains(&"StartSession"));
assert_eq!(api().labels(), vec!["HandleCors", "ThrottleRequests"]);
}
#[test]
fn a_group_can_take_an_argument() {
assert_eq!(api_throttled(10).len(), 2);
}
#[test]
fn the_session_stage_is_built_from_the_container() {
let container = Container::new();
container.instance(SessionManager::new(Arc::new(MemorySessionStore::default())));
let built = session().resolve(&container).expect("resolves");
assert_eq!(built.len(), 1);
}
#[test]
fn a_missing_session_manager_fails_with_a_readable_message() {
let err = session().resolve(&Container::new()).err().expect("should fail");
assert!(err.message().contains("StartSession"), "{}", err.message());
assert!(err.message().contains("SessionManager"), "{}", err.message());
}
#[test]
fn an_application_extends_a_group_rather_than_replacing_it() {
let extended = web().with(AddHeaders::new());
assert_eq!(extended.labels(), vec!["AddHeaders", "StartSession", "AddHeaders"]);
}
}