Skip to content

Commit

Permalink
Merge request type and destination
Browse files Browse the repository at this point in the history
  • Loading branch information
KiChjang committed Oct 23, 2017
1 parent 48c715c commit c6bb1cb
Show file tree
Hide file tree
Showing 20 changed files with 88 additions and 152 deletions.
4 changes: 2 additions & 2 deletions components/constellation/network_listener.rs
Expand Up @@ -13,7 +13,7 @@ use msg::constellation_msg::PipelineId;
use net::http_loader::{set_default_accept, set_default_accept_language};
use net_traits::{CoreResourceMsg, FetchMetadata, FetchResponseMsg};
use net_traits::{IpcSend, NetworkError, ResourceThreads};
use net_traits::request::{Destination, RequestInit, Type};
use net_traits::request::{Destination, RequestInit};
use net_traits::response::ResponseInit;
use std::sync::mpsc::Sender;

Expand Down Expand Up @@ -59,7 +59,7 @@ impl NetworkListener {
res_init_.clone(),
ipc_sender),
None => {
set_default_accept(Type::None, Destination::Document, &mut listener.req_init.headers);
set_default_accept(Destination::Document, &mut listener.req_init.headers);
set_default_accept_language(&mut listener.req_init.headers);

CoreResourceMsg::Fetch(
Expand Down
3 changes: 1 addition & 2 deletions components/gfx/font_cache_thread.rs
Expand Up @@ -7,7 +7,7 @@ use font_template::{FontTemplate, FontTemplateDescriptor};
use fontsan;
use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use net_traits::{CoreResourceThread, FetchResponseMsg, fetch_async};
use net_traits::request::{Destination, RequestInit, Type as RequestType};
use net_traits::request::{Destination, RequestInit};
use platform::font_context::FontContextHandle;
use platform::font_list::SANS_SERIF_FONT_FAMILY;
use platform::font_list::for_each_available_family;
Expand Down Expand Up @@ -237,7 +237,6 @@ impl FontCache {

let request = RequestInit {
url: url.clone(),
type_: RequestType::Font,
destination: Destination::Font,
// TODO: Add a proper origin - Can't import GlobalScope from gfx
// We can leave origin to be set by default
Expand Down
44 changes: 22 additions & 22 deletions components/net/fetch/methods.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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,
}
}
Expand Down
13 changes: 6 additions & 7 deletions components/net/http_loader.rs
Expand Up @@ -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};
Expand Down Expand Up @@ -125,13 +125,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"))),
Expand All @@ -140,7 +140,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") )),
Expand All @@ -149,7 +149,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))
Expand Down Expand Up @@ -1204,7 +1204,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();
Expand Down
6 changes: 3 additions & 3 deletions components/net/websocket_loader.rs
Expand Up @@ -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};
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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()));
}
}
Expand Down
41 changes: 18 additions & 23 deletions components/net_traits/request.rs
Expand Up @@ -19,37 +19,37 @@ pub enum Initiator {
XSLT,
}

/// A request [type](https://fetch.spec.whatwg.org/#concept-request-type)
#[derive(Clone, Copy, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub enum Type {
None,
Audio,
Font,
Image,
Script,
Style,
Track,
Video,
}

/// A request [destination](https://fetch.spec.whatwg.org/#concept-request-destination)
#[derive(Clone, Copy, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub enum Destination {
None,
Audio,
Document,
Embed,
Font,
Image,
Manifest,
Media,
Object,
Report,
Script,
ServiceWorker,
SharedWorker,
Style,
Track,
Video,
Worker,
XSLT,
Xslt,
}

impl Destination {
/// https://fetch.spec.whatwg.org/#request-destination-script-like
#[inline]
pub fn is_script_like(&self) -> bool {
*self == Destination::Script ||
*self == Destination::ServiceWorker ||
*self == Destination::SharedWorker ||
*self == Destination::Worker
}
}

/// A request [origin](https://fetch.spec.whatwg.org/#concept-request-origin)
Expand Down Expand Up @@ -150,7 +150,6 @@ pub struct RequestInit {
pub body: Option<Vec<u8>>,
pub service_workers_mode: ServiceWorkersMode,
// TODO: client object
pub type_: Type,
pub destination: Destination,
pub synchronous: bool,
pub mode: RequestMode,
Expand Down Expand Up @@ -178,7 +177,6 @@ impl Default for RequestInit {
unsafe_request: false,
body: None,
service_workers_mode: ServiceWorkersMode::All,
type_: Type::None,
destination: Destination::None,
synchronous: false,
mode: RequestMode::NoCors,
Expand Down Expand Up @@ -224,8 +222,6 @@ pub struct Request {
pub service_workers_mode: ServiceWorkersMode,
/// <https://fetch.spec.whatwg.org/#concept-request-initiator>
pub initiator: Initiator,
/// <https://fetch.spec.whatwg.org/#concept-request-type>
pub type_: Type,
/// <https://fetch.spec.whatwg.org/#concept-request-destination>
pub destination: Destination,
// TODO: priority object
Expand Down Expand Up @@ -278,7 +274,6 @@ impl Request {
keep_alive: false,
service_workers_mode: ServiceWorkersMode::All,
initiator: Initiator::None,
type_: Type::None,
destination: Destination::None,
origin: origin.unwrap_or(Origin::Client),
referrer: Referrer::Client,
Expand Down Expand Up @@ -307,7 +302,6 @@ impl Request {
req.unsafe_request = init.unsafe_request;
req.body = init.body;
req.service_workers_mode = init.service_workers_mode;
req.type_ = init.type_;
req.destination = init.destination;
req.synchronous = init.synchronous;
req.mode = init.mode;
Expand Down Expand Up @@ -356,8 +350,9 @@ impl Request {
/// <https://fetch.spec.whatwg.org/#subresource-request>
pub fn is_subresource_request(&self) -> bool {
match self.destination {
Destination::Font | Destination::Image | Destination::Manifest | Destination::Media |
Destination::Script | Destination::Style | Destination::XSLT | Destination::None => true,
Destination::Audio | Destination::Font | Destination::Image | Destination::Manifest |
Destination::Script | Destination::Style | Destination::Track | Destination::Video |
Destination::Xslt | Destination::None => true,
_ => false,
}
}
Expand Down
3 changes: 1 addition & 2 deletions components/script/dom/dedicatedworkerglobalscope.rs
Expand Up @@ -30,7 +30,7 @@ use js::jsapi::{JSAutoCompartment, JSContext, NullHandleValue};
use js::jsval::UndefinedValue;
use msg::constellation_msg::TopLevelBrowsingContextId;
use net_traits::{IpcSend, load_whole_resource};
use net_traits::request::{CredentialsMode, Destination, RequestInit, Type as RequestType};
use net_traits::request::{CredentialsMode, Destination, RequestInit};
use script_runtime::{CommonScriptMsg, ScriptChan, ScriptPort, new_rt_and_cx, Runtime};
use script_runtime::ScriptThreadEventCategory::WorkerEvent;
use script_traits::{TimerEvent, TimerSource, WorkerGlobalScopeInit, WorkerScriptLoadOrigin};
Expand Down Expand Up @@ -179,7 +179,6 @@ impl DedicatedWorkerGlobalScope {

let request = RequestInit {
url: worker_url.clone(),
type_: RequestType::Script,
destination: Destination::Worker,
credentials_mode: CredentialsMode::Include,
use_url_credentials: true,
Expand Down
3 changes: 1 addition & 2 deletions components/script/dom/htmlimageelement.rs
Expand Up @@ -46,7 +46,7 @@ use net_traits::image::base::{Image, ImageMetadata};
use net_traits::image_cache::{CanRequestImages, ImageCache, ImageOrMetadataAvailable};
use net_traits::image_cache::{ImageResponder, ImageResponse, ImageState, PendingImageId};
use net_traits::image_cache::UsePlaceholder;
use net_traits::request::{RequestInit, Type as RequestType};
use net_traits::request::RequestInit;
use network_listener::{NetworkListener, PreInvoke};
use num_traits::ToPrimitive;
use script_thread::ScriptThread;
Expand Down Expand Up @@ -275,7 +275,6 @@ impl HTMLImageElement {
let request = RequestInit {
url: img_url.clone(),
origin: document.origin().immutable().clone(),
type_: RequestType::Image,
pipeline_id: Some(document.global().pipeline_id()),
.. RequestInit::default()
};
Expand Down
11 changes: 5 additions & 6 deletions components/script/dom/htmlmediaelement.rs
Expand Up @@ -37,7 +37,7 @@ use ipc_channel::router::ROUTER;
use microtask::{Microtask, MicrotaskRunnable};
use mime::{Mime, SubLevel, TopLevel};
use net_traits::{FetchResponseListener, FetchMetadata, Metadata, NetworkError};
use net_traits::request::{CredentialsMode, Destination, RequestInit, Type as RequestType};
use net_traits::request::{CredentialsMode, Destination, RequestInit};
use network_listener::{NetworkListener, PreInvoke};
use script_thread::ScriptThread;
use servo_url::ServoUrl;
Expand Down Expand Up @@ -586,14 +586,13 @@ impl HTMLMediaElement {
// Step 4.remote.2.
// FIXME(nox): Handle CORS setting from crossorigin attribute.
let document = document_from_node(self);
let type_ = match self.media_type_id() {
HTMLMediaElementTypeId::HTMLAudioElement => RequestType::Audio,
HTMLMediaElementTypeId::HTMLVideoElement => RequestType::Video,
let destination = match self.media_type_id() {
HTMLMediaElementTypeId::HTMLAudioElement => Destination::Audio,
HTMLMediaElementTypeId::HTMLVideoElement => Destination::Video,
};
let request = RequestInit {
url,
type_,
destination: Destination::Media,
destination,
credentials_mode: CredentialsMode::Include,
use_url_credentials: true,
origin: document.origin().immutable().clone(),
Expand Down
3 changes: 1 addition & 2 deletions components/script/dom/htmlscriptelement.rs
Expand Up @@ -30,7 +30,7 @@ use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
use js::jsval::UndefinedValue;
use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError};
use net_traits::request::{CorsSettings, CredentialsMode, Destination, RequestInit, RequestMode, Type as RequestType};
use net_traits::request::{CorsSettings, CredentialsMode, Destination, RequestInit, RequestMode};
use network_listener::{NetworkListener, PreInvoke};
use servo_atoms::Atom;
use servo_config::opts;
Expand Down Expand Up @@ -238,7 +238,6 @@ fn fetch_a_classic_script(script: &HTMLScriptElement,
// Step 1, 2.
let request = RequestInit {
url: url.clone(),
type_: RequestType::Script,
destination: Destination::Script,
// https://html.spec.whatwg.org/multipage/#create-a-potential-cors-request
// Step 1
Expand Down

0 comments on commit c6bb1cb

Please sign in to comment.