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.rs76
1 files changed, 64 insertions, 12 deletions
diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs
index 748d8c56c51..dcd85c3af72 100644
--- a/components/net_traits/lib.rs
+++ b/components/net_traits/lib.rs
@@ -77,6 +77,30 @@ pub enum LoadContext {
CacheManifest,
}
+#[derive(Clone, Debug, Deserialize, Serialize, HeapSizeOf)]
+pub struct CustomResponse {
+ #[ignore_heap_size_of = "Defined in hyper"]
+ pub headers: Headers,
+ #[ignore_heap_size_of = "Defined in hyper"]
+ pub raw_status: RawStatus,
+ pub body: Vec<u8>
+}
+
+impl CustomResponse {
+ pub fn new(headers: Headers, raw_status: RawStatus, body: Vec<u8>) -> CustomResponse {
+ CustomResponse { headers: headers, raw_status: raw_status, body: body }
+ }
+}
+
+pub type CustomResponseSender = IpcSender<Option<CustomResponse>>;
+
+#[derive(Clone, Deserialize, Serialize, HeapSizeOf)]
+pub enum RequestSource {
+ Window(#[ignore_heap_size_of = "Defined in ipc-channel"] IpcSender<CustomResponseSender>),
+ Worker(#[ignore_heap_size_of = "Defined in ipc-channel"] IpcSender<CustomResponseSender>),
+ None
+}
+
#[derive(Clone, Deserialize, Serialize, HeapSizeOf)]
pub struct LoadData {
pub url: Url,
@@ -97,15 +121,14 @@ pub struct LoadData {
/// The policy and referring URL for the originator of this request
pub referrer_policy: Option<ReferrerPolicy>,
pub referrer_url: Option<Url>,
+ pub source: RequestSource,
}
impl LoadData {
pub fn new(context: LoadContext,
url: Url,
- id: Option<PipelineId>,
- referrer_policy: Option<ReferrerPolicy>,
- referrer_url: Option<Url>) -> LoadData {
+ load_origin: &LoadOrigin) -> LoadData {
LoadData {
url: url,
method: Method::Get,
@@ -113,15 +136,23 @@ impl LoadData {
preserved_headers: Headers::new(),
data: None,
cors: None,
- pipeline_id: id,
+ pipeline_id: load_origin.pipeline_id(),
credentials_flag: true,
context: context,
- referrer_policy: referrer_policy,
- referrer_url: referrer_url
+ referrer_policy: load_origin.referrer_policy(),
+ referrer_url: load_origin.referrer_url(),
+ source: load_origin.request_source()
}
}
}
+pub trait LoadOrigin {
+ fn referrer_url(&self) -> Option<Url>;
+ fn referrer_policy(&self) -> Option<ReferrerPolicy>;
+ fn request_source(&self) -> RequestSource;
+ fn pipeline_id(&self) -> Option<PipelineId>;
+}
+
/// Interface for observing the final response for an asynchronous fetch operation.
pub trait AsyncFetchListener {
fn response_available(&self, response: response::Response);
@@ -324,6 +355,7 @@ pub struct PendingAsyncLoad {
context: LoadContext,
referrer_policy: Option<ReferrerPolicy>,
referrer_url: Option<Url>,
+ source: RequestSource
}
struct PendingLoadGuard {
@@ -344,13 +376,29 @@ impl Drop for PendingLoadGuard {
}
}
+impl LoadOrigin for PendingAsyncLoad {
+ fn referrer_url(&self) -> Option<Url> {
+ self.referrer_url.clone()
+ }
+ fn referrer_policy(&self) -> Option<ReferrerPolicy> {
+ self.referrer_policy.clone()
+ }
+ fn request_source(&self) -> RequestSource {
+ self.source.clone()
+ }
+ fn pipeline_id(&self) -> Option<PipelineId> {
+ self.pipeline
+ }
+}
+
impl PendingAsyncLoad {
pub fn new(context: LoadContext,
core_resource_thread: CoreResourceThread,
url: Url,
pipeline: Option<PipelineId>,
referrer_policy: Option<ReferrerPolicy>,
- referrer_url: Option<Url>)
+ referrer_url: Option<Url>,
+ source: RequestSource)
-> PendingAsyncLoad {
PendingAsyncLoad {
core_resource_thread: core_resource_thread,
@@ -359,14 +407,18 @@ impl PendingAsyncLoad {
guard: PendingLoadGuard { loaded: false, },
context: context,
referrer_policy: referrer_policy,
- referrer_url: referrer_url
+ referrer_url: referrer_url,
+ source: source
}
}
/// 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, self.referrer_policy, self.referrer_url);
+
+ let load_data = LoadData::new(self.context.clone(),
+ self.url.clone(),
+ &self);
let consumer = LoadConsumer::Listener(listener);
self.core_resource_thread.send(CoreResourceMsg::Load(load_data, consumer, None)).unwrap();
}
@@ -480,11 +532,11 @@ pub enum ProgressMsg {
pub fn load_whole_resource(context: LoadContext,
core_resource_thread: &CoreResourceThread,
url: Url,
- pipeline_id: Option<PipelineId>)
+ load_origin: &LoadOrigin)
-> Result<(Metadata, Vec<u8>), NetworkError> {
let (start_chan, start_port) = ipc::channel().unwrap();
- core_resource_thread.send(CoreResourceMsg::Load(LoadData::new(context, url, pipeline_id, None, None),
- LoadConsumer::Channel(start_chan), None)).unwrap();
+ let load_data = LoadData::new(context, url, load_origin);
+ core_resource_thread.send(CoreResourceMsg::Load(load_data, LoadConsumer::Channel(start_chan), None)).unwrap();
let response = start_port.recv().unwrap();
let mut buf = vec!();