forked from envoyproxy/dynamic-modules-examples
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhttp_random_auth.rs
More file actions
45 lines (40 loc) · 1.72 KB
/
Copy pathhttp_random_auth.rs
File metadata and controls
45 lines (40 loc) · 1.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use envoy_proxy_dynamic_modules_rust_sdk::*;
use rand::prelude::*;
/// This implements the [`envoy_proxy_dynamic_modules_rust_sdk::HttpFilterConfig`] trait.
///
/// The trait corresponds to a Envoy filter chain configuration.
pub struct FilterConfig {}
impl FilterConfig {
/// This is the constructor for the [`FilterConfig`].
///
/// filter_config is the filter config from the Envoy config here:
/// https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/dynamic_modules/v3/dynamic_modules.proto#envoy-v3-api-msg-extensions-dynamic-modules-v3-dynamicmoduleconfig
pub fn new(_filter_config: &str) -> Self {
Self {}
}
}
impl<EHF: EnvoyHttpFilter> HttpFilterConfig<EHF> for FilterConfig {
/// This is called for each new HTTP filter.
fn new_http_filter(&mut self, _envoy: &mut EHF) -> Box<dyn HttpFilter<EHF>> {
Box::new(Filter {})
}
}
/// This implements the [`envoy_proxy_dynamic_modules_rust_sdk::HttpFilter`] trait.
///
/// This is a passthrough filter that randomly rejects requests.
pub struct Filter {}
/// This implements the [`envoy_proxy_dynamic_modules_rust_sdk::HttpFilter`] trait.
impl<EHF: EnvoyHttpFilter> HttpFilter<EHF> for Filter {
fn on_request_headers(
&mut self,
envoy_filter: &mut EHF,
_end_of_stream: bool,
) -> abi::envoy_dynamic_module_type_on_http_filter_request_headers_status {
let reject = rand::rng().random::<bool>();
if reject {
envoy_filter.send_response(403, vec![], Some(b"Access forbidden"));
return abi::envoy_dynamic_module_type_on_http_filter_request_headers_status::StopIteration;
}
abi::envoy_dynamic_module_type_on_http_filter_request_headers_status::Continue
}
}