mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
Move Arc out of HttpState
This commit is contained in:
parent
8683f4d43e
commit
64ba597a3a
7 changed files with 38 additions and 38 deletions
|
@ -41,7 +41,7 @@ pub enum Data {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct FetchContext {
|
pub struct FetchContext {
|
||||||
pub state: HttpState,
|
pub state: Arc<HttpState>,
|
||||||
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,
|
||||||
|
|
|
@ -65,19 +65,18 @@ fn read_block<R: Read>(reader: &mut R) -> Result<Data, ()> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
|
||||||
pub struct HttpState {
|
pub struct HttpState {
|
||||||
pub hsts_list: Arc<RwLock<HstsList>>,
|
pub hsts_list: RwLock<HstsList>,
|
||||||
pub cookie_jar: Arc<RwLock<CookieStorage>>,
|
pub cookie_jar: RwLock<CookieStorage>,
|
||||||
pub auth_cache: Arc<RwLock<AuthCache>>,
|
pub auth_cache: RwLock<AuthCache>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HttpState {
|
impl HttpState {
|
||||||
pub fn new() -> HttpState {
|
pub fn new() -> HttpState {
|
||||||
HttpState {
|
HttpState {
|
||||||
hsts_list: Arc::new(RwLock::new(HstsList::new())),
|
hsts_list: RwLock::new(HstsList::new()),
|
||||||
cookie_jar: Arc::new(RwLock::new(CookieStorage::new(150))),
|
cookie_jar: RwLock::new(CookieStorage::new(150)),
|
||||||
auth_cache: Arc::new(RwLock::new(AuthCache::new())),
|
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<RwLock<CookieStorage>>) {
|
pub fn set_request_cookies(url: &ServoUrl, headers: &mut Headers, cookie_jar: &RwLock<CookieStorage>) {
|
||||||
let mut cookie_jar = cookie_jar.write().unwrap();
|
let mut cookie_jar = cookie_jar.write().unwrap();
|
||||||
if let Some(cookie_list) = cookie_jar.cookies_for_url(url, CookieSource::HTTP) {
|
if let Some(cookie_list) = cookie_jar.cookies_for_url(url, CookieSource::HTTP) {
|
||||||
let mut v = Vec::new();
|
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<RwLock<CookieStorage>>,
|
fn set_cookie_for_url(cookie_jar: &RwLock<CookieStorage>,
|
||||||
request: &ServoUrl,
|
request: &ServoUrl,
|
||||||
cookie_val: String) {
|
cookie_val: String) {
|
||||||
let mut cookie_jar = cookie_jar.write().unwrap();
|
let mut cookie_jar = cookie_jar.write().unwrap();
|
||||||
|
@ -263,7 +262,7 @@ fn set_cookie_for_url(cookie_jar: &Arc<RwLock<CookieStorage>>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_cookies_from_headers(url: &ServoUrl, headers: &Headers, cookie_jar: &Arc<RwLock<CookieStorage>>) {
|
fn set_cookies_from_headers(url: &ServoUrl, headers: &Headers, cookie_jar: &RwLock<CookieStorage>) {
|
||||||
if let Some(cookies) = headers.get_raw("set-cookie") {
|
if let Some(cookies) = headers.get_raw("set-cookie") {
|
||||||
for cookie in cookies.iter() {
|
for cookie in cookies.iter() {
|
||||||
if let Ok(cookie_value) = String::from_utf8(cookie.clone()) {
|
if let Ok(cookie_value) = String::from_utf8(cookie.clone()) {
|
||||||
|
@ -363,7 +362,7 @@ fn send_response_to_devtools(devtools_chan: &Sender<DevtoolsControlMsg>,
|
||||||
let _ = devtools_chan.send(DevtoolsControlMsg::FromChrome(msg));
|
let _ = devtools_chan.send(DevtoolsControlMsg::FromChrome(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn auth_from_cache(auth_cache: &Arc<RwLock<AuthCache>>, origin: &ImmutableOrigin) -> Option<Basic> {
|
fn auth_from_cache(auth_cache: &RwLock<AuthCache>, origin: &ImmutableOrigin) -> Option<Basic> {
|
||||||
if let Some(ref auth_entry) = auth_cache.read().unwrap().entries.get(&origin.ascii_serialization()) {
|
if let Some(ref auth_entry) = auth_cache.read().unwrap().entries.get(&origin.ascii_serialization()) {
|
||||||
let user_name = auth_entry.user_name.clone();
|
let user_name = auth_entry.user_name.clone();
|
||||||
let password = Some(auth_entry.password.clone());
|
let password = Some(auth_entry.password.clone());
|
||||||
|
|
|
@ -43,7 +43,7 @@ const TFD_PROVIDER: &'static TFDProvider = &TFDProvider;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ResourceGroup {
|
pub struct ResourceGroup {
|
||||||
http_state: HttpState,
|
http_state: Arc<HttpState>,
|
||||||
ssl_client: OpensslClient,
|
ssl_client: OpensslClient,
|
||||||
connector: Arc<Pool<Connector>>,
|
connector: Arc<Pool<Connector>>,
|
||||||
}
|
}
|
||||||
|
@ -104,18 +104,18 @@ fn create_resource_groups(config_dir: Option<&Path>)
|
||||||
read_json_from_file(&mut cookie_jar, config_dir, "cookie_jar.json");
|
read_json_from_file(&mut cookie_jar, config_dir, "cookie_jar.json");
|
||||||
}
|
}
|
||||||
let http_state = HttpState {
|
let http_state = HttpState {
|
||||||
cookie_jar: Arc::new(RwLock::new(cookie_jar)),
|
cookie_jar: RwLock::new(cookie_jar),
|
||||||
auth_cache: Arc::new(RwLock::new(auth_cache)),
|
auth_cache: RwLock::new(auth_cache),
|
||||||
hsts_list: Arc::new(RwLock::new(hsts_list.clone())),
|
hsts_list: RwLock::new(hsts_list),
|
||||||
};
|
};
|
||||||
let ssl_client = create_ssl_client("certs");
|
let ssl_client = create_ssl_client("certs");
|
||||||
let resource_group = ResourceGroup {
|
let resource_group = ResourceGroup {
|
||||||
http_state: http_state,
|
http_state: Arc::new(http_state),
|
||||||
ssl_client: ssl_client.clone(),
|
ssl_client: ssl_client.clone(),
|
||||||
connector: create_http_connector(ssl_client.clone()),
|
connector: create_http_connector(ssl_client.clone()),
|
||||||
};
|
};
|
||||||
let private_resource_group = ResourceGroup {
|
let private_resource_group = ResourceGroup {
|
||||||
http_state: HttpState::new(),
|
http_state: Arc::new(HttpState::new()),
|
||||||
ssl_client: ssl_client.clone(),
|
ssl_client: ssl_client.clone(),
|
||||||
connector: create_http_connector(ssl_client),
|
connector: create_http_connector(ssl_client),
|
||||||
};
|
};
|
||||||
|
@ -355,6 +355,6 @@ impl CoreResourceManager {
|
||||||
resource_grp: &ResourceGroup) {
|
resource_grp: &ResourceGroup) {
|
||||||
websocket_loader::init(connect,
|
websocket_loader::init(connect,
|
||||||
connect_data,
|
connect_data,
|
||||||
resource_grp.http_state.cookie_jar.clone());
|
resource_grp.http_state.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ use cookie::Cookie;
|
||||||
use cookie_rs;
|
use cookie_rs;
|
||||||
use cookie_storage::CookieStorage;
|
use cookie_storage::CookieStorage;
|
||||||
use fetch::methods::{should_be_blocked_due_to_bad_port, should_be_blocked_due_to_nosniff};
|
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::buffer::BufReader;
|
||||||
use hyper::header::{Accept, CacheControl, CacheDirective, Connection, ConnectionOption};
|
use hyper::header::{Accept, CacheControl, CacheDirective, Connection, ConnectionOption};
|
||||||
use hyper::header::{Headers, Host, SetCookie, Pragma, Protocol, ProtocolName, Upgrade};
|
use hyper::header::{Headers, Host, SetCookie, Pragma, Protocol, ProtocolName, Upgrade};
|
||||||
|
@ -35,12 +35,12 @@ use websocket::sender::Sender;
|
||||||
|
|
||||||
pub fn init(connect: WebSocketCommunicate,
|
pub fn init(connect: WebSocketCommunicate,
|
||||||
connect_data: WebSocketConnectData,
|
connect_data: WebSocketConnectData,
|
||||||
cookie_jar: Arc<RwLock<CookieStorage>>) {
|
http_state: Arc<HttpState>) {
|
||||||
thread::Builder::new().name(format!("WebSocket connection to {}", connect_data.resource_url)).spawn(move || {
|
thread::Builder::new().name(format!("WebSocket connection to {}", connect_data.resource_url)).spawn(move || {
|
||||||
let channel = establish_a_websocket_connection(&connect_data.resource_url,
|
let channel = establish_a_websocket_connection(&connect_data.resource_url,
|
||||||
connect_data.origin,
|
connect_data.origin,
|
||||||
connect_data.protocols,
|
connect_data.protocols,
|
||||||
cookie_jar);
|
&http_state.cookie_jar);
|
||||||
let (ws_sender, mut receiver) = match channel {
|
let (ws_sender, mut receiver) = match channel {
|
||||||
Ok((protocol_in_use, sender, receiver)) => {
|
Ok((protocol_in_use, sender, receiver)) => {
|
||||||
let _ = connect.event_sender.send(WebSocketNetworkEvent::ConnectionEstablished { protocol_in_use });
|
let _ = connect.event_sender.send(WebSocketNetworkEvent::ConnectionEstablished { protocol_in_use });
|
||||||
|
@ -150,7 +150,7 @@ fn obtain_a_websocket_connection(url: &ServoUrl) -> Result<Stream, NetworkError>
|
||||||
fn establish_a_websocket_connection(resource_url: &ServoUrl,
|
fn establish_a_websocket_connection(resource_url: &ServoUrl,
|
||||||
origin: String,
|
origin: String,
|
||||||
protocols: Vec<String>,
|
protocols: Vec<String>,
|
||||||
cookie_jar: Arc<RwLock<CookieStorage>>)
|
cookie_jar: &RwLock<CookieStorage>)
|
||||||
-> Result<(Option<String>,
|
-> Result<(Option<String>,
|
||||||
Sender<Stream>,
|
Sender<Stream>,
|
||||||
Receiver<Stream>),
|
Receiver<Stream>),
|
||||||
|
@ -272,7 +272,7 @@ struct Response {
|
||||||
fn fetch(url: &ServoUrl,
|
fn fetch(url: &ServoUrl,
|
||||||
origin: String,
|
origin: String,
|
||||||
mut headers: Headers,
|
mut headers: Headers,
|
||||||
cookie_jar: Arc<RwLock<CookieStorage>>)
|
cookie_jar: &RwLock<CookieStorage>)
|
||||||
-> Result<Response, NetworkError> {
|
-> Result<Response, NetworkError> {
|
||||||
// Step 1.
|
// Step 1.
|
||||||
// TODO: handle request's window.
|
// TODO: handle request's window.
|
||||||
|
@ -323,7 +323,7 @@ fn fetch(url: &ServoUrl,
|
||||||
fn main_fetch(url: &ServoUrl,
|
fn main_fetch(url: &ServoUrl,
|
||||||
origin: String,
|
origin: String,
|
||||||
mut headers: Headers,
|
mut headers: Headers,
|
||||||
cookie_jar: Arc<RwLock<CookieStorage>>)
|
cookie_jar: &RwLock<CookieStorage>)
|
||||||
-> Result<Response, NetworkError> {
|
-> Result<Response, NetworkError> {
|
||||||
// Step 1.
|
// Step 1.
|
||||||
let mut response = None;
|
let mut response = None;
|
||||||
|
@ -404,7 +404,7 @@ fn main_fetch(url: &ServoUrl,
|
||||||
fn basic_fetch(url: &ServoUrl,
|
fn basic_fetch(url: &ServoUrl,
|
||||||
origin: String,
|
origin: String,
|
||||||
headers: &mut Headers,
|
headers: &mut Headers,
|
||||||
cookie_jar: Arc<RwLock<CookieStorage>>)
|
cookie_jar: &RwLock<CookieStorage>)
|
||||||
-> Result<Response, NetworkError> {
|
-> Result<Response, NetworkError> {
|
||||||
// In the case of a WebSocket request, HTTP fetch is always used.
|
// In the case of a WebSocket request, HTTP fetch is always used.
|
||||||
http_fetch(url, origin, headers, cookie_jar)
|
http_fetch(url, origin, headers, cookie_jar)
|
||||||
|
@ -414,7 +414,7 @@ fn basic_fetch(url: &ServoUrl,
|
||||||
fn http_fetch(url: &ServoUrl,
|
fn http_fetch(url: &ServoUrl,
|
||||||
origin: String,
|
origin: String,
|
||||||
headers: &mut Headers,
|
headers: &mut Headers,
|
||||||
cookie_jar: Arc<RwLock<CookieStorage>>)
|
cookie_jar: &RwLock<CookieStorage>)
|
||||||
-> Result<Response, NetworkError> {
|
-> Result<Response, NetworkError> {
|
||||||
// Step 1.
|
// Step 1.
|
||||||
// Not applicable: with step 3 being useless here, this one is too.
|
// 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,
|
fn http_network_or_cache_fetch(url: &ServoUrl,
|
||||||
origin: String,
|
origin: String,
|
||||||
headers: &mut Headers,
|
headers: &mut Headers,
|
||||||
cookie_jar: Arc<RwLock<CookieStorage>>)
|
cookie_jar: &RwLock<CookieStorage>)
|
||||||
-> Result<Response, NetworkError> {
|
-> Result<Response, NetworkError> {
|
||||||
// Steps 1-3.
|
// Steps 1-3.
|
||||||
// Not applicable: we don't even have a request yet, and there is no body
|
// 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
|
// https://fetch.spec.whatwg.org/#concept-http-network-fetch
|
||||||
fn http_network_fetch(url: &ServoUrl,
|
fn http_network_fetch(url: &ServoUrl,
|
||||||
headers: &Headers,
|
headers: &Headers,
|
||||||
cookie_jar: Arc<RwLock<CookieStorage>>)
|
cookie_jar: &RwLock<CookieStorage>)
|
||||||
-> Result<Response, NetworkError> {
|
-> Result<Response, NetworkError> {
|
||||||
// Step 1.
|
// Step 1.
|
||||||
// Not applicable: credentials flag is set.
|
// Not applicable: credentials flag is set.
|
||||||
|
|
|
@ -534,7 +534,7 @@ fn test_fetch_with_hsts() {
|
||||||
let connector = create_http_connector(ssl_client);
|
let connector = create_http_connector(ssl_client);
|
||||||
|
|
||||||
let context = FetchContext {
|
let context = FetchContext {
|
||||||
state: HttpState::new(),
|
state: Arc::new(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(),
|
||||||
|
|
|
@ -50,7 +50,7 @@ fn read_response(reader: &mut Read) -> String {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn assert_cookie_for_domain(cookie_jar: Arc<RwLock<CookieStorage>>, domain: &str, cookie: Option<&str>) {
|
fn assert_cookie_for_domain(cookie_jar: &RwLock<CookieStorage>, domain: &str, cookie: Option<&str>) {
|
||||||
let mut cookie_jar = cookie_jar.write().unwrap();
|
let mut cookie_jar = cookie_jar.write().unwrap();
|
||||||
let url = ServoUrl::parse(&*domain).unwrap();
|
let url = ServoUrl::parse(&*domain).unwrap();
|
||||||
let cookies = cookie_jar.cookies_for_url(&url, CookieSource::HTTP);
|
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);
|
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 {
|
let mut request = Request::from_init(RequestInit {
|
||||||
url: url.clone(),
|
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!(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]
|
#[test]
|
||||||
|
@ -626,7 +626,7 @@ fn test_cookie_set_with_httponly_should_not_be_available_using_getcookiesforurl(
|
||||||
|
|
||||||
let context = new_fetch_context(None);
|
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 {
|
let mut request = Request::from_init(RequestInit {
|
||||||
url: url.clone(),
|
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!(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();
|
let mut cookie_jar = context.state.cookie_jar.write().unwrap();
|
||||||
assert!(cookie_jar.cookies_for_url(&url, CookieSource::NonHTTP).is_none());
|
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);
|
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 {
|
let mut request = Request::from_init(RequestInit {
|
||||||
url: url.clone(),
|
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!(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]
|
#[test]
|
||||||
|
|
|
@ -43,6 +43,7 @@ use net_traits::FetchTaskTarget;
|
||||||
use net_traits::request::Request;
|
use net_traits::request::Request;
|
||||||
use net_traits::response::Response;
|
use net_traits::response::Response;
|
||||||
use servo_url::ServoUrl;
|
use servo_url::ServoUrl;
|
||||||
|
use std::sync::Arc;
|
||||||
use std::sync::mpsc::{Sender, channel};
|
use std::sync::mpsc::{Sender, channel};
|
||||||
|
|
||||||
const DEFAULT_USER_AGENT: &'static str = "Such Browser. Very Layout. Wow.";
|
const DEFAULT_USER_AGENT: &'static str = "Such Browser. Very Layout. Wow.";
|
||||||
|
@ -55,7 +56,7 @@ fn new_fetch_context(dc: Option<Sender<DevtoolsControlMsg>>) -> FetchContext {
|
||||||
let ssl_client = create_ssl_client("certs");
|
let ssl_client = create_ssl_client("certs");
|
||||||
let connector = create_http_connector(ssl_client);
|
let connector = create_http_connector(ssl_client);
|
||||||
FetchContext {
|
FetchContext {
|
||||||
state: HttpState::new(),
|
state: Arc::new(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(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue