use proxy_wasm::traits::*;
use proxy_wasm::types::*;
proxy_wasm::main! {{
proxy_wasm::set_log_level(LogLevel::Trace);
proxy_wasm::set_root_context(|_| -> Box<dyn RootContext> { Box::new(Root) });
}}
struct Root;
impl Context for Root {}
impl RootContext for Root {
fn get_type(&self) -> Option<ContextType> {
Some(ContextType::HttpContext)
}
fn create_http_context(&self, _: u32) -> Option<Box<dyn HttpContext>> {
Some(Box::new(Filter))
}
}
struct Filter;
impl Context for Filter {}
impl HttpContext for Filter {
fn on_http_request_headers(&mut self, _: usize, _: bool) -> Action {
let auth = self.get_http_request_header("x-auth").unwrap_or_default();
if auth != "allow" {
self.send_http_response(
401,
vec![
("content-type", "text/plain"),
("cache-control", "no-store"),
],
Some(b"auth-rejected"),
);
return Action::Pause;
}
let label = self.get_http_request_header("x-label").unwrap_or_default();
if label.is_empty() {
self.send_http_response(
403,
vec![
("content-type", "text/plain"),
("cache-control", "no-store"),
],
Some(b"label-rejected"),
);
return Action::Pause;
}
let body = format!("labeled {label}");
self.send_http_response(
200,
vec![
("content-type", "text/plain"),
("cache-control", "no-store"),
],
Some(body.as_bytes()),
);
Action::Pause
}
}