Replace NetworkError::CorsViolation and NetworkError::SecurityBlock with granular enum variants

Signed-off-by: Uthman Yahaya Baba <uthmanyahayababa@gmail.com>
This commit is contained in:
Uthman Yahaya Baba 2025-04-22 15:57:47 +01:00
parent fe4e90d7dc
commit 5f62b175fe
3 changed files with 29 additions and 20 deletions

View file

@ -283,7 +283,7 @@ pub async fn main_fetch(
if check_result == csp::CheckResult::Blocked {
warn!("Request blocked by CSP");
response = Some(Response::network_error(NetworkError::SecurityBlock))
response = Some(Response::network_error(NetworkError::ContentSecurityPolicy))
}
if should_request_be_blocked_due_to_a_bad_port(&request.current_url()) {
response = Some(Response::network_error(NetworkError::InvalidPort));
@ -363,11 +363,11 @@ pub async fn main_fetch(
// Substep 2. Return the result of running scheme fetch given fetchParams.
scheme_fetch(fetch_params, cache, target, done_chan, context).await
} else if request.mode == RequestMode::SameOrigin {
Response::network_error(NetworkError::CorsViolation)
Response::network_error(NetworkError::CrossOriginResponse)
} else if request.mode == RequestMode::NoCors {
// Substep 1. If requests redirect mode is not "follow", then return a network error.
if request.redirect_mode != RedirectMode::Follow {
Response::network_error(NetworkError::CorsViolation)
Response::network_error(NetworkError::RedirectError)
} else {
// Substep 2. Set requests response tainting to "opaque".
request.response_tainting = ResponseTainting::Opaque;
@ -511,11 +511,11 @@ pub async fn main_fetch(
let internal_response = if should_replace_with_nosniff_error {
// Defer rebinding result
blocked_error_response = Response::network_error(NetworkError::SecurityBlock);
blocked_error_response = Response::network_error(NetworkError::Nosniff);
&blocked_error_response
} else if should_replace_with_mime_type_error {
// Defer rebinding result
blocked_error_response = Response::network_error(NetworkError::SecurityBlock);
blocked_error_response = Response::network_error(NetworkError::MimeType);
&blocked_error_response
} else if should_replace_with_mixed_content {
blocked_error_response = Response::network_error(NetworkError::MixedContent);
@ -579,7 +579,7 @@ pub async fn main_fetch(
if response.termination_reason.is_none() &&
!is_response_integrity_valid(integrity_metadata, &response)
{
Response::network_error(NetworkError::SecurityBlock)
Response::network_error(NetworkError::SubresourceIntegrity)
} else {
response
}

View file

@ -843,7 +843,7 @@ pub async fn http_fetch(
// Substep 4
if cors_flag && cors_check(&fetch_params.request, &fetch_result).is_err() {
return Response::network_error(NetworkError::CorsViolation);
return Response::network_error(NetworkError::CorsGeneral);
}
fetch_result.return_internal = false;
@ -1036,7 +1036,7 @@ pub async fn http_redirect_fetch(
let has_credentials = has_credentials(&location_url);
if request.mode == RequestMode::CorsMode && !same_origin && has_credentials {
return Response::network_error(NetworkError::CorsViolation);
return Response::network_error(NetworkError::CorsCredentials);
}
// Step 9
@ -1046,7 +1046,7 @@ pub async fn http_redirect_fetch(
// Step 10
if cors_flag && has_credentials {
return Response::network_error(NetworkError::CorsViolation);
return Response::network_error(NetworkError::CorsCredentials);
}
// Step 11: If internalResponses status is not 303, requests body is non-null, and requests
@ -1601,7 +1601,7 @@ async fn http_network_or_cache_fetch(
cross_origin_resource_policy_check(http_request, &response) ==
CrossOriginResourcePolicy::Blocked
{
return Response::network_error(NetworkError::CorsViolation);
return Response::network_error(NetworkError::CorsGeneral);
}
// TODO(#33616): Step 11. Set responses URL list to a clone of httpRequests URL list.
@ -2169,7 +2169,7 @@ async fn cors_preflight_fetch(
Some(methods) => methods.iter().collect(),
// Substep 3
None => {
return Response::network_error(NetworkError::CorsViolation);
return Response::network_error(NetworkError::CorsAllowMethods);
},
}
} else {
@ -2185,7 +2185,7 @@ async fn cors_preflight_fetch(
Some(names) => names.iter().collect(),
// Substep 3
None => {
return Response::network_error(NetworkError::CorsViolation);
return Response::network_error(NetworkError::CorsAllowHeaders);
},
}
} else {
@ -2210,7 +2210,7 @@ async fn cors_preflight_fetch(
(request.credentials_mode == CredentialsMode::Include ||
methods.iter().all(|m| m.as_ref() != "*"))
{
return Response::network_error(NetworkError::CorsViolation);
return Response::network_error(NetworkError::CorsMethod);
}
debug!(
@ -2223,7 +2223,7 @@ async fn cors_preflight_fetch(
is_cors_non_wildcard_request_header_name(name) &&
header_names.iter().all(|hn| hn != name)
}) {
return Response::network_error(NetworkError::CorsViolation);
return Response::network_error(NetworkError::CorsAuthorization);
}
// Substep 7
@ -2236,7 +2236,7 @@ async fn cors_preflight_fetch(
(request.credentials_mode == CredentialsMode::Include ||
!header_names_contains_star)
{
return Response::network_error(NetworkError::CorsViolation);
return Response::network_error(NetworkError::CorsHeaders);
}
}
@ -2266,7 +2266,7 @@ async fn cors_preflight_fetch(
}
// Step 8
Response::network_error(NetworkError::CorsViolation)
Response::network_error(NetworkError::CorsGeneral)
}
/// [CORS check](https://fetch.spec.whatwg.org#concept-cors-check)

View file

@ -934,13 +934,22 @@ pub enum NetworkError {
/// Crash error, to be converted to Resource::Crash in the HTML parser.
Crash(String),
UnsupportedScheme,
CorsViolation,
CorsGeneral,
CrossOriginResponse,
CorsCredentials,
CorsAllowMethods,
CorsAllowHeaders,
CorsMethod,
CorsAuthorization,
CorsHeaders,
ConnectionFailure,
Timeout,
RedirectError,
InvalidMethod,
ResourceError,
SecurityBlock,
ContentSecurityPolicy,
Nosniff,
MimeType,
SubresourceIntegrity,
MixedContent,
CacheError,
InvalidPort,