mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Remove the sniffer task.
This commit is contained in:
parent
44930b0fb0
commit
2d730f2ae9
8 changed files with 60 additions and 101 deletions
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
use net_traits::{LoadData, Metadata};
|
use net_traits::{LoadData, Metadata};
|
||||||
use net_traits::ProgressMsg::Done;
|
use net_traits::ProgressMsg::Done;
|
||||||
use resource_task::{TargetedLoadResponse, start_sending, ResponseSenders};
|
use resource_task::start_sending;
|
||||||
use file_loader;
|
use file_loader;
|
||||||
|
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
@ -13,16 +13,12 @@ use util::resource_files::resources_dir_path;
|
||||||
|
|
||||||
use std::borrow::IntoCow;
|
use std::borrow::IntoCow;
|
||||||
use std::fs::PathExt;
|
use std::fs::PathExt;
|
||||||
use std::sync::mpsc::Sender;
|
|
||||||
|
|
||||||
pub fn factory(mut load_data: LoadData, start_chan: Sender<TargetedLoadResponse>) {
|
pub fn factory(mut load_data: LoadData) {
|
||||||
let senders = ResponseSenders {
|
|
||||||
immediate_consumer: start_chan.clone(),
|
|
||||||
eventual_consumer: load_data.consumer.clone(),
|
|
||||||
};
|
|
||||||
match load_data.url.non_relative_scheme_data().unwrap() {
|
match load_data.url.non_relative_scheme_data().unwrap() {
|
||||||
"blank" => {
|
"blank" => {
|
||||||
let chan = start_sending(senders, Metadata {
|
let start_chan = load_data.consumer;
|
||||||
|
let chan = start_sending(start_chan, Metadata {
|
||||||
final_url: load_data.url,
|
final_url: load_data.url,
|
||||||
content_type: Some(("text".to_string(), "html".to_string())),
|
content_type: Some(("text".to_string(), "html".to_string())),
|
||||||
charset: Some("utf-8".to_string()),
|
charset: Some("utf-8".to_string()),
|
||||||
|
@ -40,10 +36,11 @@ pub fn factory(mut load_data: LoadData, start_chan: Sender<TargetedLoadResponse>
|
||||||
load_data.url = Url::from_file_path(&*path).unwrap();
|
load_data.url = Url::from_file_path(&*path).unwrap();
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
start_sending(senders, Metadata::default(load_data.url))
|
let start_chan = load_data.consumer;
|
||||||
|
start_sending(start_chan, Metadata::default(load_data.url))
|
||||||
.send(Done(Err("Unknown about: URL.".to_string()))).unwrap();
|
.send(Done(Err("Unknown about: URL.".to_string()))).unwrap();
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
file_loader::factory(load_data, start_chan)
|
file_loader::factory(load_data)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,34 +4,28 @@
|
||||||
|
|
||||||
use net_traits::{LoadData, Metadata};
|
use net_traits::{LoadData, Metadata};
|
||||||
use net_traits::ProgressMsg::{Payload, Done};
|
use net_traits::ProgressMsg::{Payload, Done};
|
||||||
use resource_task::{TargetedLoadResponse, start_sending, ResponseSenders};
|
use resource_task::start_sending;
|
||||||
|
|
||||||
use rustc_serialize::base64::FromBase64;
|
use rustc_serialize::base64::FromBase64;
|
||||||
|
|
||||||
use hyper::mime::Mime;
|
use hyper::mime::Mime;
|
||||||
use url::{percent_decode, SchemeData};
|
use url::{percent_decode, SchemeData};
|
||||||
|
|
||||||
use std::sync::mpsc::Sender;
|
pub fn factory(load_data: LoadData) {
|
||||||
|
|
||||||
pub fn factory(load_data: LoadData, start_chan: Sender<TargetedLoadResponse>) {
|
|
||||||
// NB: we don't spawn a new task.
|
// NB: we don't spawn a new task.
|
||||||
// Hypothesis: data URLs are too small for parallel base64 etc. to be worth it.
|
// Hypothesis: data URLs are too small for parallel base64 etc. to be worth it.
|
||||||
// Should be tested at some point.
|
// Should be tested at some point.
|
||||||
// Left in separate function to allow easy moving to a task, if desired.
|
// Left in separate function to allow easy moving to a task, if desired.
|
||||||
load(load_data, start_chan)
|
load(load_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load(load_data: LoadData, start_chan: Sender<TargetedLoadResponse>) {
|
fn load(load_data: LoadData) {
|
||||||
|
let start_chan = load_data.consumer;
|
||||||
let url = load_data.url;
|
let url = load_data.url;
|
||||||
assert!(&*url.scheme == "data");
|
assert!(&*url.scheme == "data");
|
||||||
|
|
||||||
let mut metadata = Metadata::default(url.clone());
|
let mut metadata = Metadata::default(url.clone());
|
||||||
|
|
||||||
let senders = ResponseSenders {
|
|
||||||
immediate_consumer: start_chan,
|
|
||||||
eventual_consumer: load_data.consumer,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Split out content type and data.
|
// Split out content type and data.
|
||||||
let mut scheme_data = match url.scheme_data {
|
let mut scheme_data = match url.scheme_data {
|
||||||
SchemeData::NonRelative(scheme_data) => scheme_data,
|
SchemeData::NonRelative(scheme_data) => scheme_data,
|
||||||
|
@ -46,7 +40,7 @@ fn load(load_data: LoadData, start_chan: Sender<TargetedLoadResponse>) {
|
||||||
}
|
}
|
||||||
let parts: Vec<&str> = scheme_data.splitn(1, ',').collect();
|
let parts: Vec<&str> = scheme_data.splitn(1, ',').collect();
|
||||||
if parts.len() != 2 {
|
if parts.len() != 2 {
|
||||||
start_sending(senders, metadata).send(Done(Err("invalid data uri".to_string()))).unwrap();
|
start_sending(start_chan, metadata).send(Done(Err("invalid data uri".to_string()))).unwrap();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +58,7 @@ fn load(load_data: LoadData, start_chan: Sender<TargetedLoadResponse>) {
|
||||||
let content_type: Option<Mime> = ct_str.parse().ok();
|
let content_type: Option<Mime> = ct_str.parse().ok();
|
||||||
metadata.set_content_type(content_type.as_ref());
|
metadata.set_content_type(content_type.as_ref());
|
||||||
|
|
||||||
let progress_chan = start_sending(senders, metadata);
|
let progress_chan = start_sending(start_chan, metadata);
|
||||||
let bytes = percent_decode(parts[1].as_bytes());
|
let bytes = percent_decode(parts[1].as_bytes());
|
||||||
|
|
||||||
if is_base64 {
|
if is_base64 {
|
||||||
|
@ -93,11 +87,9 @@ fn assert_parse(url: &'static str,
|
||||||
data: Option<Vec<u8>>) {
|
data: Option<Vec<u8>>) {
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
use sniffer_task;
|
|
||||||
|
|
||||||
let (start_chan, start_port) = channel();
|
let (start_chan, start_port) = channel();
|
||||||
let sniffer_task = sniffer_task::new_mock_sniffer_task();
|
load(LoadData::new(Url::parse(url).unwrap(), start_chan));
|
||||||
load(LoadData::new(Url::parse(url).unwrap(), start_chan), sniffer_task);
|
|
||||||
|
|
||||||
let response = start_port.recv().unwrap();
|
let response = start_port.recv().unwrap();
|
||||||
assert_eq!(&response.metadata.content_type, &content_type);
|
assert_eq!(&response.metadata.content_type, &content_type);
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
use net_traits::{LoadData, Metadata, ProgressMsg};
|
use net_traits::{LoadData, Metadata, ProgressMsg};
|
||||||
use net_traits::ProgressMsg::{Payload, Done};
|
use net_traits::ProgressMsg::{Payload, Done};
|
||||||
use resource_task::{start_sending, TargetedLoadResponse, ResponseSenders};
|
use resource_task::start_sending;
|
||||||
|
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::io;
|
use std::io;
|
||||||
|
@ -30,14 +30,11 @@ fn read_all(reader: &mut io::Read, progress_chan: &Sender<ProgressMsg>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn factory(load_data: LoadData, start_chan: Sender<TargetedLoadResponse>) {
|
pub fn factory(load_data: LoadData) {
|
||||||
let url = load_data.url;
|
let url = load_data.url;
|
||||||
|
let start_chan = load_data.consumer;
|
||||||
assert!(&*url.scheme == "file");
|
assert!(&*url.scheme == "file");
|
||||||
let senders = ResponseSenders {
|
let progress_chan = start_sending(start_chan, Metadata::default(url.clone()));
|
||||||
immediate_consumer: start_chan,
|
|
||||||
eventual_consumer: load_data.consumer,
|
|
||||||
};
|
|
||||||
let progress_chan = start_sending(senders, Metadata::default(url.clone()));
|
|
||||||
spawn_named("file_loader".to_owned(), move || {
|
spawn_named("file_loader".to_owned(), move || {
|
||||||
let file_path: Result<PathBuf, ()> = url.to_file_path();
|
let file_path: Result<PathBuf, ()> = url.to_file_path();
|
||||||
match file_path {
|
match file_path {
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use net_traits::{ControlMsg, CookieSource, LoadData, Metadata};
|
use net_traits::{ControlMsg, CookieSource, LoadData, LoadResponse, Metadata};
|
||||||
use net_traits::ProgressMsg;
|
use net_traits::ProgressMsg;
|
||||||
use net_traits::ProgressMsg::{Payload, Done};
|
use net_traits::ProgressMsg::{Payload, Done};
|
||||||
use resource_task::{TargetedLoadResponse, start_sending_opt, ResponseSenders};
|
use resource_task::start_sending_opt;
|
||||||
|
|
||||||
use log;
|
use log;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
@ -31,36 +31,32 @@ use url::{Url, UrlParser};
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
|
|
||||||
pub fn factory(cookies_chan: Sender<ControlMsg>)
|
pub fn factory(cookies_chan: Sender<ControlMsg>)
|
||||||
-> Box<Invoke<(LoadData, Sender<TargetedLoadResponse>)> + Send> {
|
-> Box<Invoke<(LoadData,)> + Send> {
|
||||||
box move |(load_data, start_chan)| {
|
box move |(load_data,)| {
|
||||||
spawn_named("http_loader".to_owned(), move || load(load_data, start_chan, cookies_chan))
|
spawn_named("http_loader".to_owned(), move || load(load_data, cookies_chan))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_error(url: Url, err: String, senders: ResponseSenders) {
|
fn send_error(url: Url, err: String, start_chan: Sender<LoadResponse>) {
|
||||||
let mut metadata: Metadata = Metadata::default(url);
|
let mut metadata: Metadata = Metadata::default(url);
|
||||||
metadata.status = None;
|
metadata.status = None;
|
||||||
|
|
||||||
match start_sending_opt(senders, metadata) {
|
match start_sending_opt(start_chan, metadata) {
|
||||||
Ok(p) => p.send(Done(Err(err))).unwrap(),
|
Ok(p) => p.send(Done(Err(err))).unwrap(),
|
||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load(mut load_data: LoadData, start_chan: Sender<TargetedLoadResponse>, cookies_chan: Sender<ControlMsg>) {
|
fn load(mut load_data: LoadData, cookies_chan: Sender<ControlMsg>) {
|
||||||
// FIXME: At the time of writing this FIXME, servo didn't have any central
|
// FIXME: At the time of writing this FIXME, servo didn't have any central
|
||||||
// location for configuration. If you're reading this and such a
|
// location for configuration. If you're reading this and such a
|
||||||
// repository DOES exist, please update this constant to use it.
|
// repository DOES exist, please update this constant to use it.
|
||||||
let max_redirects = 50u;
|
let max_redirects = 50u;
|
||||||
let mut iters = 0u;
|
let mut iters = 0u;
|
||||||
|
let start_chan = load_data.consumer;
|
||||||
let mut url = load_data.url.clone();
|
let mut url = load_data.url.clone();
|
||||||
let mut redirected_to = HashSet::new();
|
let mut redirected_to = HashSet::new();
|
||||||
|
|
||||||
let senders = ResponseSenders {
|
|
||||||
immediate_consumer: start_chan,
|
|
||||||
eventual_consumer: load_data.consumer
|
|
||||||
};
|
|
||||||
|
|
||||||
// If the URL is a view-source scheme then the scheme data contains the
|
// If the URL is a view-source scheme then the scheme data contains the
|
||||||
// real URL that should be used for which the source is to be viewed.
|
// real URL that should be used for which the source is to be viewed.
|
||||||
// Change our existing URL to that and keep note that we are viewing
|
// Change our existing URL to that and keep note that we are viewing
|
||||||
|
@ -73,7 +69,7 @@ fn load(mut load_data: LoadData, start_chan: Sender<TargetedLoadResponse>, cooki
|
||||||
"http" | "https" => {}
|
"http" | "https" => {}
|
||||||
_ => {
|
_ => {
|
||||||
let s = format!("The {} scheme with view-source is not supported", url.scheme);
|
let s = format!("The {} scheme with view-source is not supported", url.scheme);
|
||||||
send_error(url, s, senders);
|
send_error(url, s, start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -84,7 +80,7 @@ fn load(mut load_data: LoadData, start_chan: Sender<TargetedLoadResponse>, cooki
|
||||||
iters = iters + 1;
|
iters = iters + 1;
|
||||||
|
|
||||||
if iters > max_redirects {
|
if iters > max_redirects {
|
||||||
send_error(url, "too many redirects".to_string(), senders);
|
send_error(url, "too many redirects".to_string(), start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +88,7 @@ fn load(mut load_data: LoadData, start_chan: Sender<TargetedLoadResponse>, cooki
|
||||||
"http" | "https" => {}
|
"http" | "https" => {}
|
||||||
_ => {
|
_ => {
|
||||||
let s = format!("{} request, but we don't support that scheme", url.scheme);
|
let s = format!("{} request, but we don't support that scheme", url.scheme);
|
||||||
send_error(url, s, senders);
|
send_error(url, s, start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,13 +121,13 @@ reason: \"certificate verify failed\" }]";
|
||||||
) => {
|
) => {
|
||||||
let mut image = resources_dir_path();
|
let mut image = resources_dir_path();
|
||||||
image.push("badcert.html");
|
image.push("badcert.html");
|
||||||
let load_data = LoadData::new(Url::from_file_path(&*image).unwrap(), senders.eventual_consumer);
|
let load_data = LoadData::new(Url::from_file_path(&*image).unwrap(), start_chan);
|
||||||
file_loader::factory(load_data, senders.immediate_consumer);
|
file_loader::factory(load_data);
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("{:?}", e);
|
println!("{:?}", e);
|
||||||
send_error(url, e.description().to_string(), senders);
|
send_error(url, e.description().to_string(), start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -179,13 +175,13 @@ reason: \"certificate verify failed\" }]";
|
||||||
let mut writer = match req.start() {
|
let mut writer = match req.start() {
|
||||||
Ok(w) => w,
|
Ok(w) => w,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
send_error(url, e.description().to_string(), senders);
|
send_error(url, e.description().to_string(), start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
match writer.write_all(&*data) {
|
match writer.write_all(&*data) {
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
send_error(url, e.description().to_string(), senders);
|
send_error(url, e.description().to_string(), start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -200,7 +196,7 @@ reason: \"certificate verify failed\" }]";
|
||||||
match req.start() {
|
match req.start() {
|
||||||
Ok(w) => w,
|
Ok(w) => w,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
send_error(url, e.description().to_string(), senders);
|
send_error(url, e.description().to_string(), start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -209,7 +205,7 @@ reason: \"certificate verify failed\" }]";
|
||||||
let mut response = match writer.send() {
|
let mut response = match writer.send() {
|
||||||
Ok(r) => r,
|
Ok(r) => r,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
send_error(url, e.description().to_string(), senders);
|
send_error(url, e.description().to_string(), start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -240,7 +236,7 @@ reason: \"certificate verify failed\" }]";
|
||||||
Some(ref c) => {
|
Some(ref c) => {
|
||||||
if c.preflight {
|
if c.preflight {
|
||||||
// The preflight lied
|
// The preflight lied
|
||||||
send_error(url, "Preflight fetch inconsistent with main fetch".to_string(), senders);
|
send_error(url, "Preflight fetch inconsistent with main fetch".to_string(), start_chan);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
// XXXManishearth There are some CORS-related steps here,
|
// XXXManishearth There are some CORS-related steps here,
|
||||||
|
@ -252,7 +248,7 @@ reason: \"certificate verify failed\" }]";
|
||||||
let new_url = match UrlParser::new().base_url(&url).parse(&new_url) {
|
let new_url = match UrlParser::new().base_url(&url).parse(&new_url) {
|
||||||
Ok(u) => u,
|
Ok(u) => u,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
send_error(url, e.to_string(), senders);
|
send_error(url, e.to_string(), start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -268,7 +264,7 @@ reason: \"certificate verify failed\" }]";
|
||||||
}
|
}
|
||||||
|
|
||||||
if redirected_to.contains(&url) {
|
if redirected_to.contains(&url) {
|
||||||
send_error(url, "redirect loop".to_string(), senders);
|
send_error(url, "redirect loop".to_string(), start_chan);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,7 +287,7 @@ reason: \"certificate verify failed\" }]";
|
||||||
metadata.headers = Some(adjusted_headers);
|
metadata.headers = Some(adjusted_headers);
|
||||||
metadata.status = Some(response.status_raw().clone());
|
metadata.status = Some(response.status_raw().clone());
|
||||||
|
|
||||||
let progress_chan = match start_sending_opt(senders, metadata) {
|
let progress_chan = match start_sending_opt(start_chan, metadata) {
|
||||||
Ok(p) => p,
|
Ok(p) => p,
|
||||||
_ => return
|
_ => return
|
||||||
};
|
};
|
||||||
|
|
|
@ -46,7 +46,6 @@ pub mod image_cache_task;
|
||||||
pub mod pub_domains;
|
pub mod pub_domains;
|
||||||
pub mod resource_task;
|
pub mod resource_task;
|
||||||
pub mod storage_task;
|
pub mod storage_task;
|
||||||
mod sniffer_task;
|
|
||||||
mod mime_classifier;
|
mod mime_classifier;
|
||||||
|
|
||||||
/// An implementation of the [Fetch spec](http://fetch.spec.whatwg.org/)
|
/// An implementation of the [Fetch spec](http://fetch.spec.whatwg.org/)
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::cmp::max;
|
use std::cmp::max;
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,6 @@ use about_loader;
|
||||||
use data_loader;
|
use data_loader;
|
||||||
use file_loader;
|
use file_loader;
|
||||||
use http_loader;
|
use http_loader;
|
||||||
use sniffer_task;
|
|
||||||
use sniffer_task::SnifferTask;
|
|
||||||
use cookie_storage::CookieStorage;
|
use cookie_storage::CookieStorage;
|
||||||
use cookie;
|
use cookie;
|
||||||
|
|
||||||
|
@ -58,32 +56,17 @@ pub fn global_init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A LoadResponse directed at a particular consumer
|
/// For use by loaders in responding to a Load message.
|
||||||
pub struct TargetedLoadResponse {
|
pub fn start_sending(start_chan: Sender<LoadResponse>, metadata: Metadata) -> Sender<ProgressMsg> {
|
||||||
pub load_response: LoadResponse,
|
start_sending_opt(start_chan, metadata).ok().unwrap()
|
||||||
pub consumer: Sender<LoadResponse>,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Data structure containing ports
|
|
||||||
pub struct ResponseSenders {
|
|
||||||
pub immediate_consumer: Sender<TargetedLoadResponse>,
|
|
||||||
pub eventual_consumer: Sender<LoadResponse>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// For use by loaders in responding to a Load message.
|
/// For use by loaders in responding to a Load message.
|
||||||
pub fn start_sending(senders: ResponseSenders, metadata: Metadata) -> Sender<ProgressMsg> {
|
pub fn start_sending_opt(start_chan: Sender<LoadResponse>, metadata: Metadata) -> Result<Sender<ProgressMsg>, ()> {
|
||||||
start_sending_opt(senders, metadata).ok().unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// For use by loaders in responding to a Load message.
|
|
||||||
pub fn start_sending_opt(senders: ResponseSenders, metadata: Metadata) -> Result<Sender<ProgressMsg>, ()> {
|
|
||||||
let (progress_chan, progress_port) = channel();
|
let (progress_chan, progress_port) = channel();
|
||||||
let result = senders.immediate_consumer.send(TargetedLoadResponse {
|
let result = start_chan.send(LoadResponse {
|
||||||
load_response: LoadResponse {
|
metadata: metadata,
|
||||||
metadata: metadata,
|
progress_port: progress_port,
|
||||||
progress_port: progress_port,
|
|
||||||
},
|
|
||||||
consumer: senders.eventual_consumer
|
|
||||||
});
|
});
|
||||||
match result {
|
match result {
|
||||||
Ok(_) => Ok(progress_chan),
|
Ok(_) => Ok(progress_chan),
|
||||||
|
@ -94,10 +77,9 @@ pub fn start_sending_opt(senders: ResponseSenders, metadata: Metadata) -> Result
|
||||||
/// Create a ResourceTask
|
/// Create a ResourceTask
|
||||||
pub fn new_resource_task(user_agent: Option<String>) -> ResourceTask {
|
pub fn new_resource_task(user_agent: Option<String>) -> ResourceTask {
|
||||||
let (setup_chan, setup_port) = channel();
|
let (setup_chan, setup_port) = channel();
|
||||||
let sniffer_task = sniffer_task::new_sniffer_task();
|
|
||||||
let setup_chan_clone = setup_chan.clone();
|
let setup_chan_clone = setup_chan.clone();
|
||||||
spawn_named("ResourceManager".to_owned(), move || {
|
spawn_named("ResourceManager".to_owned(), move || {
|
||||||
ResourceManager::new(setup_port, user_agent, sniffer_task, setup_chan_clone).start();
|
ResourceManager::new(setup_port, user_agent, setup_chan_clone).start();
|
||||||
});
|
});
|
||||||
setup_chan
|
setup_chan
|
||||||
}
|
}
|
||||||
|
@ -139,18 +121,16 @@ pub fn replace_hosts(mut load_data: LoadData, host_table: *mut HashMap<String, S
|
||||||
struct ResourceManager {
|
struct ResourceManager {
|
||||||
from_client: Receiver<ControlMsg>,
|
from_client: Receiver<ControlMsg>,
|
||||||
user_agent: Option<String>,
|
user_agent: Option<String>,
|
||||||
sniffer_task: SnifferTask,
|
|
||||||
cookie_storage: CookieStorage,
|
cookie_storage: CookieStorage,
|
||||||
resource_task: Sender<ControlMsg>,
|
resource_task: Sender<ControlMsg>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ResourceManager {
|
impl ResourceManager {
|
||||||
fn new(from_client: Receiver<ControlMsg>, user_agent: Option<String>, sniffer_task: SnifferTask,
|
fn new(from_client: Receiver<ControlMsg>, user_agent: Option<String>,
|
||||||
resource_task: Sender<ControlMsg>) -> ResourceManager {
|
resource_task: Sender<ControlMsg>) -> ResourceManager {
|
||||||
ResourceManager {
|
ResourceManager {
|
||||||
from_client: from_client,
|
from_client: from_client,
|
||||||
user_agent: user_agent,
|
user_agent: user_agent,
|
||||||
sniffer_task: sniffer_task,
|
|
||||||
cookie_storage: CookieStorage::new(),
|
cookie_storage: CookieStorage::new(),
|
||||||
resource_task: resource_task,
|
resource_task: resource_task,
|
||||||
}
|
}
|
||||||
|
@ -193,15 +173,11 @@ impl ResourceManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
self.user_agent.as_ref().map(|ua| load_data.headers.set(UserAgent(ua.clone())));
|
self.user_agent.as_ref().map(|ua| load_data.headers.set(UserAgent(ua.clone())));
|
||||||
let senders = ResponseSenders {
|
|
||||||
immediate_consumer: self.sniffer_task.clone(),
|
|
||||||
eventual_consumer: load_data.consumer.clone(),
|
|
||||||
};
|
|
||||||
|
|
||||||
fn from_factory(factory: fn(LoadData, Sender<TargetedLoadResponse>))
|
fn from_factory(factory: fn(LoadData,))
|
||||||
-> Box<Invoke<(LoadData, Sender<TargetedLoadResponse>)> + Send> {
|
-> Box<Invoke<(LoadData,)> + Send> {
|
||||||
box move |(load_data, start_chan)| {
|
box move |(load_data,)| {
|
||||||
factory(load_data, start_chan)
|
factory(load_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,14 +188,14 @@ impl ResourceManager {
|
||||||
"about" => from_factory(about_loader::factory),
|
"about" => from_factory(about_loader::factory),
|
||||||
_ => {
|
_ => {
|
||||||
debug!("resource_task: no loader for scheme {}", load_data.url.scheme);
|
debug!("resource_task: no loader for scheme {}", load_data.url.scheme);
|
||||||
start_sending(senders, Metadata::default(load_data.url))
|
start_sending(load_data.consumer, Metadata::default(load_data.url))
|
||||||
.send(ProgressMsg::Done(Err("no loader for scheme".to_string()))).unwrap();
|
.send(ProgressMsg::Done(Err("no loader for scheme".to_string()))).unwrap();
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
debug!("resource_task: loading url: {}", load_data.url.serialize());
|
debug!("resource_task: loading url: {}", load_data.url.serialize());
|
||||||
|
|
||||||
loader.invoke((load_data, self.sniffer_task.clone()));
|
loader.invoke((load_data,));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
use std::sync::mpsc::{channel, Receiver, Sender};
|
||||||
use std::thread::Builder;
|
use std::thread::Builder;
|
||||||
use mime_classifier::MIMEClassifier;
|
use mime_classifier::MIMEClassifier;
|
||||||
use resource_task::{TargetedLoadResponse, LoadResponse, ProgressMsg};
|
use resource_task::{LoadResponse, LoadResponse, ProgressMsg};
|
||||||
|
|
||||||
pub type SnifferTask = Sender<TargetedLoadResponse>;
|
pub type SnifferTask = Sender<TargetedLoadResponse>;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue