aboutsummaryrefslogtreecommitdiffstats
path: root/components/net_traits/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/net_traits/lib.rs')
-rw-r--r--components/net_traits/lib.rs56
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),
+}