perimeterx-fastly-enforcer 2.2.2

PerimeterX Fastly Compute@Edge Rust Enforcer
Documentation
use crate::px_debug;
use crate::pxconfig::PXConfig;
use fastly::{Request, Response};

pub fn is_preflight_request(req: &Request) -> bool {
    req.get_method_str().eq_ignore_ascii_case("OPTIONS")
        && req.contains_header("Origin")
        && req.contains_header("Access-Control-Request-Method")
}

pub fn is_cors_request(req: &Request) -> bool {
    req.contains_header("Origin")
}

pub fn run_preflight_custom_handler(req: &Request, conf: &PXConfig) -> Option<Response> {
    if !is_preflight_request(req) {
        return None;
    }

    conf.cors_custom_preflight_handler_fn
        .and_then(|handler| handler(req, conf))
}

pub fn should_filter_preflight_request(req: &Request, conf: &PXConfig) -> bool {
    if conf.cors_support_enabled
        && conf.cors_preflight_request_filter_enabled
        && is_preflight_request(req)
    {
        px_debug!("Skipping verification due to preflight request");
        return true;
    }

    false
}

pub fn should_add_cors_headers(req: &Request, conf: &PXConfig) -> bool {
    if conf.cors_support_enabled && is_cors_request(req) {
        px_debug!("Adding CORS headers to block response");
        return true;
    }

    false
}

pub fn get_default_cors_headers(req: &Request) -> Vec<(String, String)> {
    vec![
        (
            "Access-Control-Allow-Origin".to_string(),
            req.get_header_str_lossy("Origin")
                .map(|v| v.into_owned())
                .unwrap_or_default(),
        ),
        (
            "Access-Control-Allow-Credentials".to_string(),
            "true".to_string(),
        ),
    ]
}

pub fn apply_cors_headers_to_block_response(req: &Request, conf: &PXConfig, resp: &mut Response) {
    let headers = conf
        .cors_create_custom_block_response_headers_fn
        .map(|handler| handler(req, conf))
        .unwrap_or_else(|| get_default_cors_headers(req));

    for (name, value) in headers {
        resp.set_header(name, value);
    }
}