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

View file

@ -843,7 +843,7 @@ pub async fn http_fetch(
// Substep 4 // Substep 4
if cors_flag && cors_check(&fetch_params.request, &fetch_result).is_err() { 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; fetch_result.return_internal = false;
@ -1036,7 +1036,7 @@ pub async fn http_redirect_fetch(
let has_credentials = has_credentials(&location_url); let has_credentials = has_credentials(&location_url);
if request.mode == RequestMode::CorsMode && !same_origin && has_credentials { if request.mode == RequestMode::CorsMode && !same_origin && has_credentials {
return Response::network_error(NetworkError::CorsViolation); return Response::network_error(NetworkError::CorsCredentials);
} }
// Step 9 // Step 9
@ -1046,7 +1046,7 @@ pub async fn http_redirect_fetch(
// Step 10 // Step 10
if cors_flag && has_credentials { 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 // 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) == cross_origin_resource_policy_check(http_request, &response) ==
CrossOriginResourcePolicy::Blocked 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. // 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(), Some(methods) => methods.iter().collect(),
// Substep 3 // Substep 3
None => { None => {
return Response::network_error(NetworkError::CorsViolation); return Response::network_error(NetworkError::CorsAllowMethods);
}, },
} }
} else { } else {
@ -2185,7 +2185,7 @@ async fn cors_preflight_fetch(
Some(names) => names.iter().collect(), Some(names) => names.iter().collect(),
// Substep 3 // Substep 3
None => { None => {
return Response::network_error(NetworkError::CorsViolation); return Response::network_error(NetworkError::CorsAllowHeaders);
}, },
} }
} else { } else {
@ -2210,7 +2210,7 @@ async fn cors_preflight_fetch(
(request.credentials_mode == CredentialsMode::Include || (request.credentials_mode == CredentialsMode::Include ||
methods.iter().all(|m| m.as_ref() != "*")) methods.iter().all(|m| m.as_ref() != "*"))
{ {
return Response::network_error(NetworkError::CorsViolation); return Response::network_error(NetworkError::CorsMethod);
} }
debug!( debug!(
@ -2223,7 +2223,7 @@ async fn cors_preflight_fetch(
is_cors_non_wildcard_request_header_name(name) && is_cors_non_wildcard_request_header_name(name) &&
header_names.iter().all(|hn| hn != name) header_names.iter().all(|hn| hn != name)
}) { }) {
return Response::network_error(NetworkError::CorsViolation); return Response::network_error(NetworkError::CorsAuthorization);
} }
// Substep 7 // Substep 7
@ -2236,7 +2236,7 @@ async fn cors_preflight_fetch(
(request.credentials_mode == CredentialsMode::Include || (request.credentials_mode == CredentialsMode::Include ||
!header_names_contains_star) !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 // Step 8
Response::network_error(NetworkError::CorsViolation) Response::network_error(NetworkError::CorsGeneral)
} }
/// [CORS check](https://fetch.spec.whatwg.org#concept-cors-check) /// [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 error, to be converted to Resource::Crash in the HTML parser.
Crash(String), Crash(String),
UnsupportedScheme, UnsupportedScheme,
CorsViolation, CorsGeneral,
CrossOriginResponse,
CorsCredentials,
CorsAllowMethods,
CorsAllowHeaders,
CorsMethod,
CorsAuthorization,
CorsHeaders,
ConnectionFailure, ConnectionFailure,
Timeout,
RedirectError, RedirectError,
InvalidMethod, InvalidMethod,
ResourceError, ResourceError,
SecurityBlock, ContentSecurityPolicy,
Nosniff,
MimeType,
SubresourceIntegrity,
MixedContent, MixedContent,
CacheError, CacheError,
InvalidPort, InvalidPort,