diff options
Diffstat (limited to 'components/net_traits/lib.rs')
-rw-r--r-- | components/net_traits/lib.rs | 56 |
1 files changed, 43 insertions, 13 deletions
diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index 819d0a80335..4fea45a3a43 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -17,6 +17,7 @@ extern crate heapsize; extern crate hyper; extern crate image as piston_image; extern crate ipc_channel; +#[allow(unused_extern_crates)] #[macro_use] extern crate lazy_static; #[macro_use] @@ -32,7 +33,7 @@ use hyper::http::RawStatus; use hyper::method::Method; use hyper::mime::{Attr, Mime}; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; -use msg::constellation_msg::{PipelineId}; +use msg::constellation_msg::{PipelineId, ReferrerPolicy}; use serde::{Deserializer, Serializer}; use std::sync::mpsc::Sender; use std::thread; @@ -87,10 +88,18 @@ pub struct LoadData { // https://fetch.spec.whatwg.org/#concept-http-fetch step 4.3 pub credentials_flag: bool, pub context: LoadContext, + /// The policy and referring URL for the originator of this request + pub referrer_policy: Option<ReferrerPolicy>, + pub referrer_url: Option<Url>, + } impl LoadData { - pub fn new(context: LoadContext, url: Url, id: Option<PipelineId>) -> LoadData { + pub fn new(context: LoadContext, + url: Url, + id: Option<PipelineId>, + referrer_policy: Option<ReferrerPolicy>, + referrer_url: Option<Url>) -> LoadData { LoadData { url: url, method: Method::Get, @@ -100,7 +109,9 @@ impl LoadData { cors: None, pipeline_id: id, credentials_flag: true, - context: context + context: context, + referrer_policy: referrer_policy, + referrer_url: referrer_url } } } @@ -113,13 +124,13 @@ pub trait AsyncFetchListener { /// A listener for asynchronous network events. Cancelling the underlying request is unsupported. pub trait AsyncResponseListener { /// The response headers for a request have been received. - fn headers_available(&mut self, metadata: Metadata); + fn headers_available(&mut self, metadata: Result<Metadata, NetworkError>); /// A portion of the response body has been received. This data is unavailable after /// this method returned, and must be stored accordingly. fn data_available(&mut self, payload: Vec<u8>); /// The response is complete. If the provided status is an Err value, there is no guarantee /// that the response body was completely read. - fn response_complete(&mut self, status: Result<(), String>); + fn response_complete(&mut self, status: Result<(), NetworkError>); } /// Data for passing between threads/processes to indicate a particular action to @@ -127,11 +138,11 @@ pub trait AsyncResponseListener { #[derive(Deserialize, Serialize)] pub enum ResponseAction { /// Invoke headers_available - HeadersAvailable(Metadata), + HeadersAvailable(Result<Metadata, NetworkError>), /// Invoke data_available DataAvailable(Vec<u8>), /// Invoke response_complete - ResponseComplete(Result<(), String>) + ResponseComplete(Result<(), NetworkError>) } impl ResponseAction { @@ -234,6 +245,8 @@ pub struct PendingAsyncLoad { pipeline: Option<PipelineId>, guard: PendingLoadGuard, context: LoadContext, + referrer_policy: Option<ReferrerPolicy>, + referrer_url: Option<Url>, } struct PendingLoadGuard { @@ -255,21 +268,28 @@ impl Drop for PendingLoadGuard { } impl PendingAsyncLoad { - pub fn new(context: LoadContext, resource_thread: ResourceThread, url: Url, pipeline: Option<PipelineId>) + pub fn new(context: LoadContext, + resource_thread: ResourceThread, + url: Url, + pipeline: Option<PipelineId>, + referrer_policy: Option<ReferrerPolicy>, + referrer_url: Option<Url>) -> PendingAsyncLoad { PendingAsyncLoad { resource_thread: resource_thread, url: url, pipeline: pipeline, guard: PendingLoadGuard { loaded: false, }, - context: context + context: context, + referrer_policy: referrer_policy, + referrer_url: referrer_url } } /// Initiate the network request associated with this pending load, using the provided target. pub fn load_async(mut self, listener: AsyncResponseTarget) { self.guard.neuter(); - let load_data = LoadData::new(self.context, self.url, self.pipeline); + let load_data = LoadData::new(self.context, self.url, self.pipeline, self.referrer_policy, self.referrer_url); let consumer = LoadConsumer::Listener(listener); self.resource_thread.send(ControlMsg::Load(load_data, consumer, None)).unwrap(); } @@ -376,7 +396,7 @@ pub enum ProgressMsg { /// Binary data - there may be multiple of these Payload(Vec<u8>), /// Indicates loading is complete, either successfully or not - Done(Result<(), String>) + Done(Result<(), NetworkError>), } /// Convenience function for synchronously loading a whole resource. @@ -384,9 +404,9 @@ pub fn load_whole_resource(context: LoadContext, resource_thread: &ResourceThread, url: Url, pipeline_id: Option<PipelineId>) - -> Result<(Metadata, Vec<u8>), String> { + -> Result<(Metadata, Vec<u8>), NetworkError> { let (start_chan, start_port) = ipc::channel().unwrap(); - resource_thread.send(ControlMsg::Load(LoadData::new(context, url, pipeline_id), + resource_thread.send(ControlMsg::Load(LoadData::new(context, url, pipeline_id, None, None), LoadConsumer::Channel(start_chan), None)).unwrap(); let response = start_port.recv().unwrap(); @@ -413,3 +433,13 @@ pub enum ConstellationMsg { /// Queries whether a pipeline or its ancestors are private IsPrivate(PipelineId, Sender<bool>), } + +/// Network errors that have to be exported out of the loaders +#[derive(Clone, PartialEq, Eq, Debug, Deserialize, Serialize, HeapSizeOf)] +pub enum NetworkError { + /// Could be any of the internal errors, like unsupported scheme, load + /// cancellation, connection errors, etc. + Internal(String), + /// SSL validation error that has to be handled in the HTML parser + SslValidation(Url), +} |