diff options
Diffstat (limited to 'components/net/resource_thread.rs')
-rw-r--r-- | components/net/resource_thread.rs | 30 |
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) { |