From 64ba597a3a92cf6fe2c69a92626c70e710468a69 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 3 Apr 2017 14:00:36 +0200 Subject: [PATCH] Move Arc out of HttpState --- components/net/fetch/methods.rs | 2 +- components/net/http_loader.rs | 21 ++++++++++----------- components/net/resource_thread.rs | 14 +++++++------- components/net/websocket_loader.rs | 20 ++++++++++---------- tests/unit/net/fetch.rs | 2 +- tests/unit/net/http_loader.rs | 14 +++++++------- tests/unit/net/lib.rs | 3 ++- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs index 438a630e4f9..e824d09d0bf 100644 --- a/components/net/fetch/methods.rs +++ b/components/net/fetch/methods.rs @@ -41,7 +41,7 @@ pub enum Data { } pub struct FetchContext { - pub state: HttpState, + pub state: Arc, pub user_agent: Cow<'static, str>, pub devtools_chan: Option>, pub filemanager: FileManager, diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index fc55b110f1e..f55b94b533c 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -65,19 +65,18 @@ fn read_block(reader: &mut R) -> Result { } } -#[derive(Clone)] pub struct HttpState { - pub hsts_list: Arc>, - pub cookie_jar: Arc>, - pub auth_cache: Arc>, + pub hsts_list: RwLock, + pub cookie_jar: RwLock, + pub auth_cache: RwLock, } impl HttpState { pub fn new() -> HttpState { HttpState { - hsts_list: Arc::new(RwLock::new(HstsList::new())), - cookie_jar: Arc::new(RwLock::new(CookieStorage::new(150))), - auth_cache: Arc::new(RwLock::new(AuthCache::new())), + hsts_list: RwLock::new(HstsList::new()), + cookie_jar: RwLock::new(CookieStorage::new(150)), + auth_cache: RwLock::new(AuthCache::new()), } } } @@ -238,7 +237,7 @@ pub fn determine_request_referrer(headers: &mut Headers, } } -pub fn set_request_cookies(url: &ServoUrl, headers: &mut Headers, cookie_jar: &Arc>) { +pub fn set_request_cookies(url: &ServoUrl, headers: &mut Headers, cookie_jar: &RwLock) { let mut cookie_jar = cookie_jar.write().unwrap(); if let Some(cookie_list) = cookie_jar.cookies_for_url(url, CookieSource::HTTP) { let mut v = Vec::new(); @@ -247,7 +246,7 @@ pub fn set_request_cookies(url: &ServoUrl, headers: &mut Headers, cookie_jar: &A } } -fn set_cookie_for_url(cookie_jar: &Arc>, +fn set_cookie_for_url(cookie_jar: &RwLock, request: &ServoUrl, cookie_val: String) { let mut cookie_jar = cookie_jar.write().unwrap(); @@ -263,7 +262,7 @@ fn set_cookie_for_url(cookie_jar: &Arc>, } } -fn set_cookies_from_headers(url: &ServoUrl, headers: &Headers, cookie_jar: &Arc>) { +fn set_cookies_from_headers(url: &ServoUrl, headers: &Headers, cookie_jar: &RwLock) { if let Some(cookies) = headers.get_raw("set-cookie") { for cookie in cookies.iter() { if let Ok(cookie_value) = String::from_utf8(cookie.clone()) { @@ -363,7 +362,7 @@ fn send_response_to_devtools(devtools_chan: &Sender, let _ = devtools_chan.send(DevtoolsControlMsg::FromChrome(msg)); } -fn auth_from_cache(auth_cache: &Arc>, origin: &ImmutableOrigin) -> Option { +fn auth_from_cache(auth_cache: &RwLock, origin: &ImmutableOrigin) -> Option { if let Some(ref auth_entry) = auth_cache.read().unwrap().entries.get(&origin.ascii_serialization()) { let user_name = auth_entry.user_name.clone(); let password = Some(auth_entry.password.clone()); diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index 76935b27b4e..987f085855b 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -43,7 +43,7 @@ const TFD_PROVIDER: &'static TFDProvider = &TFDProvider; #[derive(Clone)] pub struct ResourceGroup { - http_state: HttpState, + http_state: Arc, ssl_client: OpensslClient, connector: Arc>, } @@ -104,18 +104,18 @@ fn create_resource_groups(config_dir: Option<&Path>) read_json_from_file(&mut cookie_jar, config_dir, "cookie_jar.json"); } let http_state = HttpState { - cookie_jar: Arc::new(RwLock::new(cookie_jar)), - auth_cache: Arc::new(RwLock::new(auth_cache)), - hsts_list: Arc::new(RwLock::new(hsts_list.clone())), + cookie_jar: RwLock::new(cookie_jar), + auth_cache: RwLock::new(auth_cache), + hsts_list: RwLock::new(hsts_list), }; let ssl_client = create_ssl_client("certs"); let resource_group = ResourceGroup { - http_state: http_state, + http_state: Arc::new(http_state), ssl_client: ssl_client.clone(), connector: create_http_connector(ssl_client.clone()), }; let private_resource_group = ResourceGroup { - http_state: HttpState::new(), + http_state: Arc::new(HttpState::new()), ssl_client: ssl_client.clone(), connector: create_http_connector(ssl_client), }; @@ -355,6 +355,6 @@ impl CoreResourceManager { resource_grp: &ResourceGroup) { websocket_loader::init(connect, connect_data, - resource_grp.http_state.cookie_jar.clone()); + resource_grp.http_state.clone()); } } diff --git a/components/net/websocket_loader.rs b/components/net/websocket_loader.rs index c4670d6b727..948a2261c60 100644 --- a/components/net/websocket_loader.rs +++ b/components/net/websocket_loader.rs @@ -6,7 +6,7 @@ use cookie::Cookie; use cookie_rs; use cookie_storage::CookieStorage; use fetch::methods::{should_be_blocked_due_to_bad_port, should_be_blocked_due_to_nosniff}; -use http_loader::{is_redirect_status, set_request_cookies}; +use http_loader::{HttpState, is_redirect_status, set_request_cookies}; use hyper::buffer::BufReader; use hyper::header::{Accept, CacheControl, CacheDirective, Connection, ConnectionOption}; use hyper::header::{Headers, Host, SetCookie, Pragma, Protocol, ProtocolName, Upgrade}; @@ -35,12 +35,12 @@ use websocket::sender::Sender; pub fn init(connect: WebSocketCommunicate, connect_data: WebSocketConnectData, - cookie_jar: Arc>) { + http_state: Arc) { thread::Builder::new().name(format!("WebSocket connection to {}", connect_data.resource_url)).spawn(move || { let channel = establish_a_websocket_connection(&connect_data.resource_url, connect_data.origin, connect_data.protocols, - cookie_jar); + &http_state.cookie_jar); let (ws_sender, mut receiver) = match channel { Ok((protocol_in_use, sender, receiver)) => { let _ = connect.event_sender.send(WebSocketNetworkEvent::ConnectionEstablished { protocol_in_use }); @@ -150,7 +150,7 @@ fn obtain_a_websocket_connection(url: &ServoUrl) -> Result fn establish_a_websocket_connection(resource_url: &ServoUrl, origin: String, protocols: Vec, - cookie_jar: Arc>) + cookie_jar: &RwLock) -> Result<(Option, Sender, Receiver), @@ -272,7 +272,7 @@ struct Response { fn fetch(url: &ServoUrl, origin: String, mut headers: Headers, - cookie_jar: Arc>) + cookie_jar: &RwLock) -> Result { // Step 1. // TODO: handle request's window. @@ -323,7 +323,7 @@ fn fetch(url: &ServoUrl, fn main_fetch(url: &ServoUrl, origin: String, mut headers: Headers, - cookie_jar: Arc>) + cookie_jar: &RwLock) -> Result { // Step 1. let mut response = None; @@ -404,7 +404,7 @@ fn main_fetch(url: &ServoUrl, fn basic_fetch(url: &ServoUrl, origin: String, headers: &mut Headers, - cookie_jar: Arc>) + cookie_jar: &RwLock) -> Result { // In the case of a WebSocket request, HTTP fetch is always used. http_fetch(url, origin, headers, cookie_jar) @@ -414,7 +414,7 @@ fn basic_fetch(url: &ServoUrl, fn http_fetch(url: &ServoUrl, origin: String, headers: &mut Headers, - cookie_jar: Arc>) + cookie_jar: &RwLock) -> Result { // Step 1. // Not applicable: with step 3 being useless here, this one is too. @@ -464,7 +464,7 @@ fn http_fetch(url: &ServoUrl, fn http_network_or_cache_fetch(url: &ServoUrl, origin: String, headers: &mut Headers, - cookie_jar: Arc>) + cookie_jar: &RwLock) -> Result { // Steps 1-3. // Not applicable: we don't even have a request yet, and there is no body @@ -569,7 +569,7 @@ fn http_network_or_cache_fetch(url: &ServoUrl, // https://fetch.spec.whatwg.org/#concept-http-network-fetch fn http_network_fetch(url: &ServoUrl, headers: &Headers, - cookie_jar: Arc>) + cookie_jar: &RwLock) -> Result { // Step 1. // Not applicable: credentials flag is set. diff --git a/tests/unit/net/fetch.rs b/tests/unit/net/fetch.rs index 8ae9ae8c784..73be2a5fbbd 100644 --- a/tests/unit/net/fetch.rs +++ b/tests/unit/net/fetch.rs @@ -534,7 +534,7 @@ fn test_fetch_with_hsts() { let connector = create_http_connector(ssl_client); let context = FetchContext { - state: HttpState::new(), + state: Arc::new(HttpState::new()), user_agent: DEFAULT_USER_AGENT.into(), devtools_chan: None, filemanager: FileManager::new(), diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index 517a1c0741c..30da574875e 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -50,7 +50,7 @@ fn read_response(reader: &mut Read) -> String { } } -fn assert_cookie_for_domain(cookie_jar: Arc>, domain: &str, cookie: Option<&str>) { +fn assert_cookie_for_domain(cookie_jar: &RwLock, domain: &str, cookie: Option<&str>) { let mut cookie_jar = cookie_jar.write().unwrap(); let url = ServoUrl::parse(&*domain).unwrap(); let cookies = cookie_jar.cookies_for_url(&url, CookieSource::HTTP); @@ -518,7 +518,7 @@ fn test_load_sets_cookies_in_the_resource_manager_when_it_get_set_cookie_header_ let context = new_fetch_context(None); - assert_cookie_for_domain(context.state.cookie_jar.clone(), url.as_str(), None); + assert_cookie_for_domain(&context.state.cookie_jar, url.as_str(), None); let mut request = Request::from_init(RequestInit { url: url.clone(), @@ -536,7 +536,7 @@ fn test_load_sets_cookies_in_the_resource_manager_when_it_get_set_cookie_header_ assert!(response.status.unwrap().is_success()); - assert_cookie_for_domain(context.state.cookie_jar.clone(), url.as_str(), Some("mozillaIs=theBest")); + assert_cookie_for_domain(&context.state.cookie_jar, url.as_str(), Some("mozillaIs=theBest")); } #[test] @@ -626,7 +626,7 @@ fn test_cookie_set_with_httponly_should_not_be_available_using_getcookiesforurl( let context = new_fetch_context(None); - assert_cookie_for_domain(context.state.cookie_jar.clone(), url.as_str(), None); + assert_cookie_for_domain(&context.state.cookie_jar, url.as_str(), None); let mut request = Request::from_init(RequestInit { url: url.clone(), @@ -644,7 +644,7 @@ fn test_cookie_set_with_httponly_should_not_be_available_using_getcookiesforurl( assert!(response.status.unwrap().is_success()); - assert_cookie_for_domain(context.state.cookie_jar.clone(), url.as_str(), Some("mozillaIs=theBest")); + assert_cookie_for_domain(&context.state.cookie_jar, url.as_str(), Some("mozillaIs=theBest")); let mut cookie_jar = context.state.cookie_jar.write().unwrap(); assert!(cookie_jar.cookies_for_url(&url, CookieSource::NonHTTP).is_none()); } @@ -660,7 +660,7 @@ fn test_when_cookie_received_marked_secure_is_ignored_for_http() { let context = new_fetch_context(None); - assert_cookie_for_domain(context.state.cookie_jar.clone(), url.as_str(), None); + assert_cookie_for_domain(&context.state.cookie_jar, url.as_str(), None); let mut request = Request::from_init(RequestInit { url: url.clone(), @@ -678,7 +678,7 @@ fn test_when_cookie_received_marked_secure_is_ignored_for_http() { assert!(response.status.unwrap().is_success()); - assert_cookie_for_domain(context.state.cookie_jar.clone(), url.as_str(), None); + assert_cookie_for_domain(&context.state.cookie_jar, url.as_str(), None); } #[test] diff --git a/tests/unit/net/lib.rs b/tests/unit/net/lib.rs index 740a7e6c505..6326faade4d 100644 --- a/tests/unit/net/lib.rs +++ b/tests/unit/net/lib.rs @@ -43,6 +43,7 @@ use net_traits::FetchTaskTarget; use net_traits::request::Request; use net_traits::response::Response; use servo_url::ServoUrl; +use std::sync::Arc; use std::sync::mpsc::{Sender, channel}; const DEFAULT_USER_AGENT: &'static str = "Such Browser. Very Layout. Wow."; @@ -55,7 +56,7 @@ fn new_fetch_context(dc: Option>) -> FetchContext { let ssl_client = create_ssl_client("certs"); let connector = create_http_connector(ssl_client); FetchContext { - state: HttpState::new(), + state: Arc::new(HttpState::new()), user_agent: DEFAULT_USER_AGENT.into(), devtools_chan: dc, filemanager: FileManager::new(),