blob: 17ce735a48bf6cb0a3e85ca1239b52a27c381391 [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
use log::trace;
use proxy_wasm::traits::*;
use proxy_wasm::types::*;
use primes::is_prime;
proxy_wasm::main! {{
proxy_wasm::set_log_level(LogLevel::Trace);
proxy_wasm::set_root_context(|_| -> Box<dyn RootContext> { Box::new(HelloWorld) });
}}
struct HelloWorld;
impl Context for HelloWorld {}
impl RootContext for HelloWorld {
fn on_vm_start(&mut self, _: usize) -> bool {
trace!("Hello, World!");
true
}
fn get_type(&self) -> Option<ContextType> {
Some(ContextType::HttpContext)
}
fn create_http_context(&self, context_id: u32) -> Option<Box<dyn HttpContext>> {
Some(Box::new(HttpHeaders { context_id }))
}
}
struct HttpHeaders {
context_id: u32,
}
impl Context for HttpHeaders {}
impl HttpContext for HttpHeaders {
fn on_http_request_headers(&mut self, _: usize, _: bool) -> Action {
for (name, value) in &self.get_http_request_headers() {
let s3 = format!("In WASM: #{} -> {}: {}",self.context_id, name, value);
trace!("{}", s3);
}
if let Some(ua) = self.get_http_request_header("User-Agent") {
if ua != "" {
trace!("UA is {}", ua);
}
}
match self.get_http_request_header("token") {
Some(token) if token.parse::<u64>().is_ok() && is_prime(token.parse().unwrap()) => {
trace!("It is prime!!!");
Action::Continue
}
_ => {
trace!("It is not prime!!! That's true.");
self.send_http_response(
403,
vec![("Powered-By", "proxy-wasm")],
Some(b"Access forbidden.\n"),
);
Action::Pause
}
}
}
}