aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/fetch
diff options
context:
space:
mode:
authorShubham Gupta <32428749+shubhamg13@users.noreply.github.com>2025-02-10 13:30:24 +0800
committerGitHub <noreply@github.com>2025-02-10 05:30:24 +0000
commitb72932bc88e65507156ae2d1664b717c10629b25 (patch)
tree0d200b3628671c524482a43dbd3b6bee3063d379 /components/net/fetch
parent84006ba76d1d6d7f64104d4c708e83610d6938df (diff)
downloadservo-b72932bc88e65507156ae2d1664b717c10629b25.tar.gz
servo-b72932bc88e65507156ae2d1664b717c10629b25.zip
Add support for Upgrade a mixed content request. (#34794)
Signed-off-by: Shubham Gupta <shubham13297@gmail.com>
Diffstat (limited to 'components/net/fetch')
-rw-r--r--components/net/fetch/methods.rs56
1 files changed, 52 insertions, 4 deletions
diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs
index 09670ec106f..2b4a54f262a 100644
--- a/components/net/fetch/methods.rs
+++ b/components/net/fetch/methods.rs
@@ -23,8 +23,8 @@ use net_traits::http_status::HttpStatus;
use net_traits::policy_container::{PolicyContainer, RequestPolicyContainer};
use net_traits::request::{
is_cors_safelisted_method, is_cors_safelisted_request_header, BodyChunkRequest,
- BodyChunkResponse, CredentialsMode, Destination, InsecureRequestsPolicy, Origin, RedirectMode,
- Referrer, Request, RequestMode, ResponseTainting, Window,
+ BodyChunkResponse, CredentialsMode, Destination, Initiator, InsecureRequestsPolicy, Origin,
+ RedirectMode, Referrer, Request, RequestMode, ResponseTainting, Window,
};
use net_traits::response::{Response, ResponseBody, ResponseType};
use net_traits::{
@@ -34,7 +34,7 @@ use net_traits::{
use rustls_pki_types::CertificateDer;
use serde::{Deserialize, Serialize};
use servo_arc::Arc as ServoArc;
-use servo_url::ServoUrl;
+use servo_url::{Host, ServoUrl};
use tokio::sync::mpsc::{UnboundedReceiver as TokioReceiver, UnboundedSender as TokioSender};
use super::fetch_params::FetchParams;
@@ -244,7 +244,9 @@ pub async fn main_fetch(
// TODO: handle request abort.
// Step 4. Upgrade request to a potentially trustworthy URL, if appropriate.
- if should_upgrade_request_to_potentially_trustworty(request, context) {
+ if should_upgrade_request_to_potentially_trustworty(request, context) ||
+ should_upgrade_mixed_content_request(request)
+ {
trace!(
"upgrading {} targeting {:?}",
request.current_url(),
@@ -940,3 +942,49 @@ fn should_upgrade_request_to_potentially_trustworty(
// Step 4
request.insecure_requests_policy == InsecureRequestsPolicy::Upgrade
}
+
+// TODO : Needs to revisit
+/// <https://w3c.github.io/webappsec-mixed-content/#categorize-settings-object>
+fn does_settings_prohobit_mixed_security_contexts(url: &ServoUrl) -> bool {
+ if url.is_origin_trustworthy() {
+ return true;
+ }
+
+ false
+}
+
+/// <https://w3c.github.io/webappsec-mixed-content/#upgrade-algorithm>
+fn should_upgrade_mixed_content_request(request: &Request) -> bool {
+ let url = request.url();
+ dbg!("Shubham {}", url.scheme());
+ // Step 1.1 : request’s URL is a potentially trustworthy URL.
+ if url.is_potentially_trustworthy() {
+ return false;
+ }
+
+ // Step 1.2 : request’s URL’s host is an IP address.
+ match url.host() {
+ Some(Host::Ipv4(_)) | Some(Host::Ipv6(_)) => return false,
+ _ => (),
+ }
+
+ // Step 1.3
+ if !does_settings_prohobit_mixed_security_contexts(&url) {
+ return false;
+ }
+
+ // Step 1.4 : request’s destination is not "image", "audio", or "video".
+ if matches!(
+ request.destination,
+ Destination::Audio | Destination::Image | Destination::Video
+ ) {
+ return false;
+ }
+
+ // Step 1.5 : request’s destination is "image" and request’s initiator is "imageset".
+ if request.destination == Destination::Image && request.initiator == Initiator::ImageSet {
+ return false;
+ }
+
+ true
+}