mirror of
https://github.com/lexmount/moli.git
synced 2026-10-18 00:01:32 +00:00
refactor(fetch): share effective referrer policy selection
This commit is contained in:
@@ -68,8 +68,9 @@ pub use network_fetch_result::{
|
||||
NetworkResponseObservation,
|
||||
};
|
||||
pub use referrer_policy::{
|
||||
DEFAULT_REFERRER_POLICY, normalize_referrer_policy, origin_referrer_url, referrer_header_value,
|
||||
referrer_value, response_referrer_policy_from_headers, sanitized_referrer_url,
|
||||
DEFAULT_REFERRER_POLICY, effective_referrer_policy, normalize_referrer_policy,
|
||||
origin_referrer_url, referrer_header_value, referrer_value,
|
||||
response_referrer_policy_from_headers, sanitized_referrer_url,
|
||||
};
|
||||
pub use request::{
|
||||
BrowserNavigationRequestKind, BrowserRequestMetadata, FetchPriorityHint, Request, RequestAuth,
|
||||
|
||||
@@ -3,6 +3,17 @@ use url::Url;
|
||||
|
||||
pub const DEFAULT_REFERRER_POLICY: &str = "strict-origin-when-cross-origin";
|
||||
|
||||
/// An empty request policy inherits the document policy before using the default.
|
||||
pub fn effective_referrer_policy<'a>(
|
||||
request_policy: Option<&'a str>,
|
||||
document_policy: Option<&'a str>,
|
||||
) -> &'a str {
|
||||
request_policy
|
||||
.filter(|policy| !policy.is_empty())
|
||||
.or_else(|| document_policy.filter(|policy| !policy.is_empty()))
|
||||
.unwrap_or(DEFAULT_REFERRER_POLICY)
|
||||
}
|
||||
|
||||
const VALID_REFERRER_POLICIES: &[&str] = &[
|
||||
"no-referrer",
|
||||
"no-referrer-when-downgrade",
|
||||
@@ -73,10 +84,7 @@ pub fn referrer_value(
|
||||
return None;
|
||||
}
|
||||
|
||||
let policy = referrer_policy
|
||||
.filter(|policy| !policy.is_empty())
|
||||
.or_else(|| document_referrer_policy.filter(|policy| !policy.is_empty()))
|
||||
.unwrap_or(DEFAULT_REFERRER_POLICY);
|
||||
let policy = effective_referrer_policy(referrer_policy, document_referrer_policy);
|
||||
let same_origin = same_origin(referrer_url, request_url);
|
||||
let downgrade = is_downgrade_request(referrer_url, request_url);
|
||||
|
||||
@@ -342,3 +350,20 @@ mod empty_policy_tests {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod inheritance_tests {
|
||||
use super::{DEFAULT_REFERRER_POLICY, effective_referrer_policy};
|
||||
#[test]
|
||||
fn effective_policy_uses_request_then_document_then_default() {
|
||||
for (request, document, expected) in [
|
||||
(None, None, DEFAULT_REFERRER_POLICY),
|
||||
(Some(""), Some(""), DEFAULT_REFERRER_POLICY),
|
||||
(None, Some("no-referrer"), "no-referrer"),
|
||||
(Some(""), Some("origin"), "origin"),
|
||||
(Some("same-origin"), Some("origin"), "same-origin"),
|
||||
] {
|
||||
assert_eq!(effective_referrer_policy(request, document), expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user