|
|
@ -48,10 +48,16 @@ impl CORS { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
fn valid_url(url: String) -> String { |
|
|
|
match url.as_ref() { |
|
|
|
"file://" => "*".to_string(), |
|
|
|
_ => url, |
|
|
|
// Check a request's `Origin` header against the list of allowed origins.
|
|
|
|
// If a match exists, return it. Otherwise, return None.
|
|
|
|
fn get_allowed_origin(headers: &HeaderMap) -> Option<String> { |
|
|
|
let origin = CORS::get_header(headers, "Origin"); |
|
|
|
let domain_origin = CONFIG.domain_origin(); |
|
|
|
let safari_extension_origin = "file://"; |
|
|
|
if origin == domain_origin || origin == safari_extension_origin { |
|
|
|
Some(origin) |
|
|
|
} else { |
|
|
|
None |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -67,11 +73,11 @@ impl Fairing for CORS { |
|
|
|
fn on_response(&self, request: &Request, response: &mut Response) { |
|
|
|
let req_headers = request.headers(); |
|
|
|
|
|
|
|
// We need to explicitly get the Origin header for Access-Control-Allow-Origin
|
|
|
|
let req_allow_origin = CORS::valid_url(CORS::get_header(req_headers, "Origin")); |
|
|
|
|
|
|
|
response.set_header(Header::new("Access-Control-Allow-Origin", req_allow_origin)); |
|
|
|
if let Some(origin) = CORS::get_allowed_origin(req_headers) { |
|
|
|
response.set_header(Header::new("Access-Control-Allow-Origin", origin)); |
|
|
|
} |
|
|
|
|
|
|
|
// Preflight request
|
|
|
|
if request.method() == Method::Options { |
|
|
|
let req_allow_headers = CORS::get_header(req_headers, "Access-Control-Request-Headers"); |
|
|
|
let req_allow_method = CORS::get_header(req_headers, "Access-Control-Request-Method"); |
|
|
|