Move the HTTP connector to FetchContext

This commit is contained in:
Anthony Ramine 2017-04-03 11:38:30 +02:00
parent 7b16021a89
commit 016fee016b
6 changed files with 23 additions and 13 deletions

View file

@ -3,13 +3,14 @@
* 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 blob_loader::load_blob_sync; use blob_loader::load_blob_sync;
use connector::Connector;
use data_loader::decode; use data_loader::decode;
use devtools_traits::DevtoolsControlMsg; use devtools_traits::DevtoolsControlMsg;
use fetch::cors_cache::CorsCache; use fetch::cors_cache::CorsCache;
use filemanager_thread::FileManager; use filemanager_thread::FileManager;
use http_loader::{HttpState, determine_request_referrer, http_fetch, set_default_accept_language}; use http_loader::{HttpState, determine_request_referrer, http_fetch, set_default_accept_language};
use hyper::Error; use hyper::{Error, Result as HyperResult};
use hyper::error::Result as HyperResult; use hyper::client::Pool;
use hyper::header::{Accept, AcceptLanguage, ContentLanguage, ContentType}; use hyper::header::{Accept, AcceptLanguage, ContentLanguage, ContentType};
use hyper::header::{Header, HeaderFormat, HeaderView, Headers, QualityItem}; use hyper::header::{Header, HeaderFormat, HeaderView, Headers, QualityItem};
use hyper::header::{Referer as RefererHeader, q, qitem}; use hyper::header::{Referer as RefererHeader, q, qitem};
@ -28,6 +29,7 @@ use std::fs::File;
use std::io::Read; use std::io::Read;
use std::mem; use std::mem;
use std::str; use std::str;
use std::sync::Arc;
use std::sync::mpsc::{Sender, Receiver}; use std::sync::mpsc::{Sender, Receiver};
use subresource_integrity::is_response_integrity_valid; use subresource_integrity::is_response_integrity_valid;
@ -43,6 +45,7 @@ pub struct FetchContext {
pub user_agent: Cow<'static, str>, pub user_agent: Cow<'static, str>,
pub devtools_chan: Option<Sender<DevtoolsControlMsg>>, pub devtools_chan: Option<Sender<DevtoolsControlMsg>>,
pub filemanager: FileManager, pub filemanager: FileManager,
pub connector: Arc<Pool<Connector>>,
} }
pub type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>; pub type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>;

View file

@ -3,7 +3,7 @@
* 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 brotli::Decompressor; use brotli::Decompressor;
use connector::{Connector, create_http_connector, create_ssl_client}; use connector::Connector;
use cookie; use cookie;
use cookie_storage::CookieStorage; use cookie_storage::CookieStorage;
use devtools_traits::{ChromeToDevtoolsControlMsg, DevtoolsControlMsg, HttpRequest as DevtoolsHttpRequest}; use devtools_traits::{ChromeToDevtoolsControlMsg, DevtoolsControlMsg, HttpRequest as DevtoolsHttpRequest};
@ -69,17 +69,14 @@ pub struct HttpState {
pub hsts_list: Arc<RwLock<HstsList>>, pub hsts_list: Arc<RwLock<HstsList>>,
pub cookie_jar: Arc<RwLock<CookieStorage>>, pub cookie_jar: Arc<RwLock<CookieStorage>>,
pub auth_cache: Arc<RwLock<AuthCache>>, pub auth_cache: Arc<RwLock<AuthCache>>,
pub connector_pool: Arc<Pool<Connector>>,
} }
impl HttpState { impl HttpState {
pub fn new(certificate_path: &str) -> HttpState { pub fn new() -> HttpState {
let ssl_client = create_ssl_client(certificate_path);
HttpState { HttpState {
hsts_list: Arc::new(RwLock::new(HstsList::new())), hsts_list: Arc::new(RwLock::new(HstsList::new())),
cookie_jar: Arc::new(RwLock::new(CookieStorage::new(150))), cookie_jar: Arc::new(RwLock::new(CookieStorage::new(150))),
auth_cache: Arc::new(RwLock::new(AuthCache::new())), auth_cache: Arc::new(RwLock::new(AuthCache::new())),
connector_pool: create_http_connector(ssl_client),
} }
} }
} }
@ -1048,7 +1045,7 @@ fn http_network_fetch(request: &Request,
// Step 4 // Step 4
let factory = NetworkHttpRequestFactory { let factory = NetworkHttpRequestFactory {
connector: context.state.connector_pool.clone(), connector: context.connector.clone(),
}; };
let url = request.current_url(); let url = request.current_url();

View file

@ -42,7 +42,7 @@ extern crate websocket;
mod blob_loader; mod blob_loader;
mod chrome_loader; mod chrome_loader;
mod connector; pub mod connector;
pub mod cookie; pub mod cookie;
pub mod cookie_storage; pub mod cookie_storage;
mod data_loader; mod data_loader;

View file

@ -330,12 +330,12 @@ impl CoreResourceManager {
hsts_list: group.hsts_list.clone(), hsts_list: group.hsts_list.clone(),
cookie_jar: group.cookie_jar.clone(), cookie_jar: group.cookie_jar.clone(),
auth_cache: group.auth_cache.clone(), auth_cache: group.auth_cache.clone(),
// FIXME(#15694): use group.connector.clone() instead.
connector_pool: create_http_connector(group.ssl_client.clone()),
}; };
let ua = self.user_agent.clone(); let ua = self.user_agent.clone();
let dc = self.devtools_chan.clone(); let dc = self.devtools_chan.clone();
let filemanager = self.filemanager.clone(); let filemanager = self.filemanager.clone();
// FIXME(#15694): use group.connector.clone() instead.
let connector = create_http_connector(group.ssl_client.clone());
thread::Builder::new().name(format!("fetch thread for {}", init.url)).spawn(move || { thread::Builder::new().name(format!("fetch thread for {}", init.url)).spawn(move || {
let mut request = Request::from_init(init); let mut request = Request::from_init(init);
@ -348,6 +348,7 @@ impl CoreResourceManager {
user_agent: ua, user_agent: ua,
devtools_chan: dc, devtools_chan: dc,
filemanager: filemanager, filemanager: filemanager,
connector: connector,
}; };
fetch(&mut request, &mut sender, &context); fetch(&mut request, &mut sender, &context);
}).expect("Thread spawning failed"); }).expect("Thread spawning failed");

View file

@ -23,6 +23,7 @@ use hyper::status::StatusCode;
use hyper::uri::RequestUri; use hyper::uri::RequestUri;
use hyper_openssl; use hyper_openssl;
use msg::constellation_msg::TEST_PIPELINE_ID; use msg::constellation_msg::TEST_PIPELINE_ID;
use net::connector::{create_http_connector, create_ssl_client};
use net::fetch::cors_cache::CorsCache; use net::fetch::cors_cache::CorsCache;
use net::fetch::methods::FetchContext; use net::fetch::methods::FetchContext;
use net::filemanager_thread::FileManager; use net::filemanager_thread::FileManager;
@ -529,11 +530,15 @@ fn test_fetch_with_hsts() {
//takes an address and something that implements hyper::net::Ssl //takes an address and something that implements hyper::net::Ssl
let mut server = Server::https("0.0.0.0:0", ssl).unwrap().handle_threads(handler, 1).unwrap(); let mut server = Server::https("0.0.0.0:0", ssl).unwrap().handle_threads(handler, 1).unwrap();
let ssl_client = create_ssl_client("self_signed_certificate_for_testing.crt");
let connector = create_http_connector(ssl_client);
let context = FetchContext { let context = FetchContext {
state: HttpState::new("self_signed_certificate_for_testing.crt"), state: HttpState::new(),
user_agent: DEFAULT_USER_AGENT.into(), user_agent: DEFAULT_USER_AGENT.into(),
devtools_chan: None, devtools_chan: None,
filemanager: FileManager::new(), filemanager: FileManager::new(),
connector: connector,
}; };
{ {

View file

@ -34,6 +34,7 @@ extern crate url;
use devtools_traits::DevtoolsControlMsg; use devtools_traits::DevtoolsControlMsg;
use hyper::server::{Handler, Listening, Server}; use hyper::server::{Handler, Listening, Server};
use net::connector::{create_http_connector, create_ssl_client};
use net::fetch::cors_cache::CorsCache; use net::fetch::cors_cache::CorsCache;
use net::fetch::methods::{self, FetchContext}; use net::fetch::methods::{self, FetchContext};
use net::filemanager_thread::FileManager; use net::filemanager_thread::FileManager;
@ -51,11 +52,14 @@ struct FetchResponseCollector {
} }
fn new_fetch_context(dc: Option<Sender<DevtoolsControlMsg>>) -> FetchContext { fn new_fetch_context(dc: Option<Sender<DevtoolsControlMsg>>) -> FetchContext {
let ssl_client = create_ssl_client("certs");
let connector = create_http_connector(ssl_client);
FetchContext { FetchContext {
state: HttpState::new("certs"), state: HttpState::new(),
user_agent: DEFAULT_USER_AGENT.into(), user_agent: DEFAULT_USER_AGENT.into(),
devtools_chan: dc, devtools_chan: dc,
filemanager: FileManager::new(), filemanager: FileManager::new(),
connector: connector,
} }
} }
impl FetchTaskTarget for FetchResponseCollector { impl FetchTaskTarget for FetchResponseCollector {