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);
}
}