mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Auto merge of #18981 - KiChjang:fold-type-destination, r=avadacatavra
Merge request type and destination Fixes #18278. <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/18981) <!-- Reviewable:end -->
This commit is contained in:
commit
dcd7d2fa32
20 changed files with 88 additions and 152 deletions
|
@ -17,8 +17,8 @@ use hyper::mime::{Mime, SubLevel, TopLevel};
|
|||
use hyper::status::StatusCode;
|
||||
use mime_guess::guess_mime_type;
|
||||
use net_traits::{FetchTaskTarget, NetworkError, ReferrerPolicy};
|
||||
use net_traits::request::{CredentialsMode, Referrer, Request, RequestMode, ResponseTainting};
|
||||
use net_traits::request::{Type, Origin, Window};
|
||||
use net_traits::request::{CredentialsMode, Destination, Referrer, Request, RequestMode};
|
||||
use net_traits::request::{ResponseTainting, Origin, Window};
|
||||
use net_traits::response::{Response, ResponseBody, ResponseType};
|
||||
use servo_url::ServoUrl;
|
||||
use std::ascii::AsciiExt;
|
||||
|
@ -73,7 +73,7 @@ pub fn fetch_with_cors_cache(request: &mut Request,
|
|||
}
|
||||
|
||||
// Step 3.
|
||||
set_default_accept(request.type_, request.destination, &mut request.headers);
|
||||
set_default_accept(request.destination, &mut request.headers);
|
||||
|
||||
// Step 4.
|
||||
set_default_accept_language(&mut request.headers);
|
||||
|
@ -266,9 +266,9 @@ pub fn main_fetch(request: &mut Request,
|
|||
// Tests for steps 17 and 18, before step 15 for borrowing concerns.
|
||||
let response_is_network_error = response.is_network_error();
|
||||
let should_replace_with_nosniff_error =
|
||||
!response_is_network_error && should_be_blocked_due_to_nosniff(request.type_, &response.headers);
|
||||
!response_is_network_error && should_be_blocked_due_to_nosniff(request.destination, &response.headers);
|
||||
let should_replace_with_mime_type_error =
|
||||
!response_is_network_error && should_be_blocked_due_to_mime_type(request.type_, &response.headers);
|
||||
!response_is_network_error && should_be_blocked_due_to_mime_type(request.destination, &response.headers);
|
||||
|
||||
// Step 15.
|
||||
let mut network_error_response = response.get_network_error().cloned().map(Response::network_error);
|
||||
|
@ -529,7 +529,7 @@ fn is_null_body_status(status: &Option<StatusCode>) -> bool {
|
|||
}
|
||||
|
||||
/// <https://fetch.spec.whatwg.org/#should-response-to-request-be-blocked-due-to-nosniff?>
|
||||
pub fn should_be_blocked_due_to_nosniff(request_type: Type, response_headers: &Headers) -> bool {
|
||||
pub fn should_be_blocked_due_to_nosniff(destination: Destination, response_headers: &Headers) -> bool {
|
||||
/// <https://fetch.spec.whatwg.org/#x-content-type-options-header>
|
||||
/// This is needed to parse `X-Content-Type-Options` according to spec,
|
||||
/// which requires that we inspect only the first value.
|
||||
|
@ -599,37 +599,37 @@ pub fn should_be_blocked_due_to_nosniff(request_type: Type, response_headers: &H
|
|||
}
|
||||
|
||||
// Assumes str::starts_with is equivalent to mime::TopLevel
|
||||
return match request_type {
|
||||
match content_type_header {
|
||||
// Step 6
|
||||
Type::Script => {
|
||||
match content_type_header {
|
||||
Some(&ContentType(ref mime_type)) => !is_javascript_mime_type(&mime_type),
|
||||
None => true
|
||||
}
|
||||
}
|
||||
Some(&ContentType(ref mime_type)) if destination.is_script_like()
|
||||
=> !is_javascript_mime_type(mime_type),
|
||||
|
||||
// Step 7
|
||||
Type::Style => {
|
||||
match content_type_header {
|
||||
Some(&ContentType(Mime(TopLevel::Text, SubLevel::Css, _))) => false,
|
||||
_ => true
|
||||
}
|
||||
}
|
||||
Some(&ContentType(Mime(ref tl, ref sl, _))) if destination == Destination::Style
|
||||
=> *tl != TopLevel::Text && *sl != SubLevel::Css,
|
||||
|
||||
None if destination == Destination::Style || destination.is_script_like() => true,
|
||||
// Step 8
|
||||
_ => false
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <https://fetch.spec.whatwg.org/#should-response-to-request-be-blocked-due-to-mime-type?>
|
||||
fn should_be_blocked_due_to_mime_type(request_type: Type, response_headers: &Headers) -> bool {
|
||||
fn should_be_blocked_due_to_mime_type(destination: Destination, response_headers: &Headers) -> bool {
|
||||
// Step 1
|
||||
let mime_type = match response_headers.get::<ContentType>() {
|
||||
Some(header) => header,
|
||||
None => return false,
|
||||
};
|
||||
request_type == Type::Script && match *mime_type {
|
||||
|
||||
// Step 2-3
|
||||
destination.is_script_like() && match *mime_type {
|
||||
ContentType(Mime(TopLevel::Audio, _, _)) |
|
||||
ContentType(Mime(TopLevel::Video, _, _)) |
|
||||
ContentType(Mime(TopLevel::Image, _, _)) => true,
|
||||
ContentType(Mime(TopLevel::Text, SubLevel::Ext(ref ext), _)) => ext == "csv",
|
||||
|
||||
// Step 4
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@ use msg::constellation_msg::PipelineId;
|
|||
use net_traits::{CookieSource, FetchMetadata, NetworkError, ReferrerPolicy};
|
||||
use net_traits::request::{CacheMode, CredentialsMode, Destination, Origin};
|
||||
use net_traits::request::{RedirectMode, Referrer, Request, RequestMode};
|
||||
use net_traits::request::{ResponseTainting, ServiceWorkersMode, Type};
|
||||
use net_traits::request::{ResponseTainting, ServiceWorkersMode};
|
||||
use net_traits::response::{HttpsState, Response, ResponseBody, ResponseType};
|
||||
use resource_thread::AuthCache;
|
||||
use servo_url::{ImmutableOrigin, ServoUrl};
|
||||
|
@ -122,13 +122,13 @@ impl WrappedHttpResponse {
|
|||
}
|
||||
|
||||
// Step 3 of https://fetch.spec.whatwg.org/#concept-fetch.
|
||||
pub fn set_default_accept(type_: Type, destination: Destination, headers: &mut Headers) {
|
||||
pub fn set_default_accept(destination: Destination, headers: &mut Headers) {
|
||||
if headers.has::<Accept>() {
|
||||
return;
|
||||
}
|
||||
let value = match (type_, destination) {
|
||||
let value = match destination {
|
||||
// Step 3.2.
|
||||
(_, Destination::Document) => {
|
||||
Destination::Document => {
|
||||
vec![
|
||||
qitem(mime!(Text / Html)),
|
||||
qitem(mime!(Application / ("xhtml+xml"))),
|
||||
|
@ -137,7 +137,7 @@ pub fn set_default_accept(type_: Type, destination: Destination, headers: &mut H
|
|||
]
|
||||
},
|
||||
// Step 3.3.
|
||||
(Type::Image, _) => {
|
||||
Destination::Image => {
|
||||
vec![
|
||||
qitem(mime!(Image / Png)),
|
||||
qitem(mime!(Image / ("svg+xml") )),
|
||||
|
@ -146,7 +146,7 @@ pub fn set_default_accept(type_: Type, destination: Destination, headers: &mut H
|
|||
]
|
||||
},
|
||||
// Step 3.3.
|
||||
(Type::Style, _) => {
|
||||
Destination::Style => {
|
||||
vec![
|
||||
qitem(mime!(Text / Css)),
|
||||
QualityItem::new(mime!(_ / _), q(0.1))
|
||||
|
@ -1201,7 +1201,6 @@ fn cors_preflight_fetch(request: &Request,
|
|||
let mut preflight = Request::new(request.current_url(), Some(request.origin.clone()), request.pipeline_id);
|
||||
preflight.method = Method::Options;
|
||||
preflight.initiator = request.initiator.clone();
|
||||
preflight.type_ = request.type_.clone();
|
||||
preflight.destination = request.destination.clone();
|
||||
preflight.origin = request.origin.clone();
|
||||
preflight.referrer = request.referrer.clone();
|
||||
|
|
|
@ -17,7 +17,7 @@ use hyper::status::StatusCode;
|
|||
use hyper::version::HttpVersion;
|
||||
use net_traits::{CookieSource, MessageData, NetworkError, WebSocketCommunicate, WebSocketConnectData};
|
||||
use net_traits::{WebSocketDomAction, WebSocketNetworkEvent};
|
||||
use net_traits::request::{Destination, Type};
|
||||
use net_traits::request::Destination;
|
||||
use servo_url::ServoUrl;
|
||||
use std::ascii::AsciiExt;
|
||||
use std::io::{self, Write};
|
||||
|
@ -280,7 +280,7 @@ fn fetch(url: ServoUrl,
|
|||
// TODO: handle request's origin.
|
||||
|
||||
// Step 3.
|
||||
set_default_accept(Type::None, Destination::None, &mut headers);
|
||||
set_default_accept(Destination::None, &mut headers);
|
||||
|
||||
// Step 4.
|
||||
set_default_accept_language(&mut headers);
|
||||
|
@ -370,7 +370,7 @@ fn main_fetch(url: ServoUrl,
|
|||
// TODO: handle blocking as mixed content.
|
||||
// TODO: handle blocking by content security policy.
|
||||
// Not applicable: blocking due to MIME type matters only for scripts.
|
||||
if should_be_blocked_due_to_nosniff(Type::None, &headers) {
|
||||
if should_be_blocked_due_to_nosniff(Destination::None, &headers) {
|
||||
response = Err(NetworkError::Internal("Request should be blocked due to nosniff.".into()));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue