aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/resource_thread.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/net/resource_thread.rs')
-rw-r--r--components/net/resource_thread.rs30
1 files changed, 28 insertions, 2 deletions
diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs
index fecbff3e077..6e94fd1cf03 100644
--- a/components/net/resource_thread.rs
+++ b/components/net/resource_thread.rs
@@ -11,6 +11,7 @@ use cookie;
use cookie_storage::CookieStorage;
use data_loader;
use devtools_traits::DevtoolsControlMsg;
+use fetch::methods::{fetch, FetchContext};
use file_loader;
use filemanager_thread::FileManagerThreadFactory;
use hsts::HstsList;
@@ -22,9 +23,11 @@ use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use mime_classifier::{ApacheBugFlag, MIMEClassifier, NoSniffFlag};
use net_traits::LoadContext;
use net_traits::ProgressMsg::Done;
+use net_traits::request::{Request, RequestInit};
use net_traits::{AsyncResponseTarget, Metadata, ProgressMsg, ResponseAction, CoreResourceThread};
-use net_traits::{CoreResourceMsg, CookieSource, LoadConsumer, LoadData, LoadResponse, ResourceId};
-use net_traits::{NetworkError, WebSocketCommunicate, WebSocketConnectData, ResourceThreads};
+use net_traits::{CoreResourceMsg, CookieSource, FetchResponseMsg, FetchTaskTarget, LoadConsumer};
+use net_traits::{LoadData, LoadResponse, NetworkError, ResourceId};
+use net_traits::{WebSocketCommunicate, WebSocketConnectData, ResourceThreads};
use profile_traits::time::ProfilerChan;
use rustc_serialize::json;
use rustc_serialize::{Decodable, Encodable};
@@ -36,6 +39,7 @@ use std::error::Error;
use std::fs::File;
use std::io::prelude::*;
use std::path::Path;
+use std::rc::Rc;
use std::sync::mpsc::{Receiver, Sender, channel};
use std::sync::{Arc, RwLock};
use storage_thread::StorageThreadFactory;
@@ -193,6 +197,8 @@ impl ResourceChannelManager {
match self.from_client.recv().unwrap() {
CoreResourceMsg::Load(load_data, consumer, id_sender) =>
self.resource_manager.load(load_data, consumer, id_sender, control_sender.clone()),
+ CoreResourceMsg::Fetch(init, sender) =>
+ self.resource_manager.fetch(init, sender),
CoreResourceMsg::WebsocketConnect(connect, connect_data) =>
self.resource_manager.websocket_connect(connect, connect_data),
CoreResourceMsg::SetCookiesForUrl(request, cookie_list, source) =>
@@ -480,6 +486,26 @@ impl CoreResourceManager {
cancel_listener));
}
+ fn fetch(&self, init: RequestInit, sender: IpcSender<FetchResponseMsg>) {
+ let http_state = HttpState {
+ hsts_list: self.hsts_list.clone(),
+ cookie_jar: self.cookie_jar.clone(),
+ auth_cache: self.auth_cache.clone(),
+ blocked_content: BLOCKED_CONTENT_RULES.clone(),
+ };
+ let ua = self.user_agent.clone();
+ spawn_named(format!("fetch thread for {}", init.url), move || {
+ let request = Request::from_init(init);
+ // XXXManishearth: Check origin against pipeline id (also ensure that the mode is allowed)
+ // todo load context / mimesniff in fetch
+ // todo referrer policy?
+ // todo service worker stuff
+ let mut target = Some(Box::new(sender) as Box<FetchTaskTarget + Send + 'static>);
+ let context = FetchContext { state: http_state, user_agent: ua };
+ fetch(Rc::new(request), &mut target, context);
+ })
+ }
+
fn websocket_connect(&self,
connect: WebSocketCommunicate,
connect_data: WebSocketConnectData) {