mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
delegate resource reading to embedder
This commit is contained in:
parent
21517504cb
commit
9fb5795f37
52 changed files with 472 additions and 396 deletions
|
@ -16,6 +16,7 @@ base64 = "0.6"
|
|||
brotli = "1.0.6"
|
||||
cookie = "0.10"
|
||||
devtools_traits = {path = "../devtools_traits"}
|
||||
embedder_traits = { path = "../embedder_traits" }
|
||||
flate2 = "1"
|
||||
hyper = "0.10"
|
||||
hyper_serde = "0.8"
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
use servo_config::resource_files::resources_dir_path;
|
||||
use servo_url::ServoUrl;
|
||||
use std::fs::canonicalize;
|
||||
use url::percent_encoding::percent_decode;
|
||||
|
||||
pub fn resolve_chrome_url(url: &ServoUrl) -> Result<ServoUrl, ()> {
|
||||
assert_eq!(url.scheme(), "chrome");
|
||||
if url.host_str() != Some("resources") {
|
||||
return Err(())
|
||||
}
|
||||
let resources = canonicalize(resources_dir_path().expect("Error finding resource folder"))
|
||||
.expect("Error canonicalizing path to the resources directory");
|
||||
let mut path = resources.clone();
|
||||
for segment in url.path_segments().unwrap() {
|
||||
match percent_decode(segment.as_bytes()).decode_utf8() {
|
||||
// Check ".." to prevent access to files outside of the resources directory.
|
||||
Ok(segment) => path.push(&*segment),
|
||||
_ => return Err(())
|
||||
}
|
||||
}
|
||||
match canonicalize(path) {
|
||||
Ok(ref path) if path.starts_with(&resources) && path.exists() => {
|
||||
Ok(ServoUrl::from_file_path(path).unwrap())
|
||||
}
|
||||
_ => Err(())
|
||||
}
|
||||
}
|
|
@ -9,9 +9,9 @@ use hyper::net::{NetworkConnector, HttpsStream, HttpStream, SslClient};
|
|||
use hyper_openssl::OpensslClient;
|
||||
use openssl::ssl::{SSL_OP_NO_COMPRESSION, SSL_OP_NO_SSLV2, SSL_OP_NO_SSLV3};
|
||||
use openssl::ssl::{SslConnectorBuilder, SslMethod};
|
||||
use openssl::x509;
|
||||
use std::io;
|
||||
use std::net::TcpStream;
|
||||
use std::path::PathBuf;
|
||||
|
||||
pub struct HttpsConnector {
|
||||
ssl: OpensslClient,
|
||||
|
@ -50,9 +50,33 @@ impl NetworkConnector for HttpsConnector {
|
|||
|
||||
pub type Connector = HttpsConnector;
|
||||
|
||||
pub fn create_ssl_client(ca_file: &PathBuf) -> OpensslClient {
|
||||
pub fn create_ssl_client(certs: &str) -> OpensslClient {
|
||||
// certs include multiple certificates. We could add all of them at once,
|
||||
// but if any of them were already added, openssl would fail to insert all
|
||||
// of them.
|
||||
let mut certs = certs;
|
||||
let mut ssl_connector_builder = SslConnectorBuilder::new(SslMethod::tls()).unwrap();
|
||||
ssl_connector_builder.set_ca_file(ca_file).expect("could not set CA file");
|
||||
loop {
|
||||
let token = "-----END CERTIFICATE-----";
|
||||
if let Some(index) = certs.find(token) {
|
||||
let (cert, rest) = certs.split_at(index + token.len());
|
||||
certs = rest;
|
||||
let cert = x509::X509::from_pem(cert.as_bytes()).unwrap();
|
||||
ssl_connector_builder.cert_store_mut().add_cert(cert).or_else(|e| {
|
||||
let v: Option<Option<&str>> = e.errors().iter().nth(0).map(|e| e.reason());
|
||||
if v == Some(Some("cert already in hash table")) {
|
||||
warn!("Cert already in hash table. Ignoring.");
|
||||
// Ignore error X509_R_CERT_ALREADY_IN_HASH_TABLE which means the
|
||||
// certificate is already in the store.
|
||||
Ok(())
|
||||
} else {
|
||||
Err(e)
|
||||
}
|
||||
}).expect("could not set CA file");
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ssl_connector_builder.set_cipher_list(DEFAULT_CIPHERS).expect("could not set ciphers");
|
||||
ssl_connector_builder.set_options(SSL_OP_NO_SSLV2 | SSL_OP_NO_SSLV3 | SSL_OP_NO_COMPRESSION);
|
||||
let ssl_connector = ssl_connector_builder.build();
|
||||
|
|
|
@ -2,14 +2,13 @@
|
|||
* 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/. */
|
||||
|
||||
use embedder_traits::resources::{self, Resource};
|
||||
use net_traits::IncludeSubdomains;
|
||||
use net_traits::pub_domains::reg_suffix;
|
||||
use serde_json;
|
||||
use servo_config::resource_files::read_resource_file;
|
||||
use servo_url::ServoUrl;
|
||||
use std::collections::HashMap;
|
||||
use std::net::{Ipv4Addr, Ipv6Addr};
|
||||
use std::str::from_utf8;
|
||||
use time;
|
||||
|
||||
#[derive(Clone, Deserialize, Serialize)]
|
||||
|
@ -64,15 +63,13 @@ impl HstsList {
|
|||
}
|
||||
|
||||
/// Create an `HstsList` from the bytes of a JSON preload file.
|
||||
pub fn from_preload(preload_content: &[u8]) -> Option<HstsList> {
|
||||
pub fn from_preload(preload_content: &str) -> Option<HstsList> {
|
||||
#[derive(Deserialize)]
|
||||
struct HstsEntries {
|
||||
entries: Vec<HstsEntry>,
|
||||
}
|
||||
|
||||
let hsts_entries: Option<HstsEntries> = from_utf8(&preload_content)
|
||||
.ok()
|
||||
.and_then(|c| serde_json::from_str(c).ok());
|
||||
let hsts_entries: Option<HstsEntries> = serde_json::from_str(preload_content).ok();
|
||||
|
||||
hsts_entries.map_or(None, |hsts_entries| {
|
||||
let mut hsts_list: HstsList = HstsList::new();
|
||||
|
@ -86,10 +83,8 @@ impl HstsList {
|
|||
}
|
||||
|
||||
pub fn from_servo_preload() -> HstsList {
|
||||
let file_bytes = read_resource_file("hsts_preload.json")
|
||||
.expect("Could not find Servo HSTS preload file");
|
||||
HstsList::from_preload(&file_bytes)
|
||||
.expect("Servo HSTS preload file is invalid")
|
||||
let list = resources::read_string(Resource::HstsPreloadList);
|
||||
HstsList::from_preload(&list).expect("Servo HSTS preload file is invalid")
|
||||
}
|
||||
|
||||
pub fn is_host_secure(&self, host: &str) -> bool {
|
||||
|
|
|
@ -2,20 +2,18 @@
|
|||
* 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/. */
|
||||
|
||||
use embedder_traits::resources::{self, Resource};
|
||||
use immeta::load_from_buf;
|
||||
use net_traits::{FetchMetadata, FetchResponseMsg, NetworkError};
|
||||
use net_traits::image::base::{Image, ImageMetadata, PixelFormat, load_from_memory};
|
||||
use net_traits::image_cache::{CanRequestImages, ImageCache, ImageResponder};
|
||||
use net_traits::image_cache::{ImageOrMetadataAvailable, ImageResponse, ImageState};
|
||||
use net_traits::image_cache::{PendingImageId, UsePlaceholder};
|
||||
use servo_config::resource_files::resources_dir_path;
|
||||
use servo_url::ServoUrl;
|
||||
use std::collections::HashMap;
|
||||
use std::collections::hash_map::Entry::{Occupied, Vacant};
|
||||
use std::fs::File;
|
||||
use std::io::{self, Read};
|
||||
use std::io;
|
||||
use std::mem;
|
||||
use std::path::PathBuf;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::thread;
|
||||
use webrender_api;
|
||||
|
@ -42,11 +40,8 @@ fn decode_bytes_sync(key: LoadKey, bytes: &[u8]) -> DecoderMsg {
|
|||
}
|
||||
}
|
||||
|
||||
fn get_placeholder_image(webrender_api: &webrender_api::RenderApi, path: &PathBuf) -> io::Result<Arc<Image>> {
|
||||
let mut file = File::open(path)?;
|
||||
let mut image_data = vec![];
|
||||
file.read_to_end(&mut image_data)?;
|
||||
let mut image = load_from_memory(&image_data).unwrap();
|
||||
fn get_placeholder_image(webrender_api: &webrender_api::RenderApi, data: &[u8]) -> io::Result<Arc<Image>> {
|
||||
let mut image = load_from_memory(&data).unwrap();
|
||||
set_webrender_image_key(webrender_api, &mut image);
|
||||
Ok(Arc::new(image))
|
||||
}
|
||||
|
@ -403,15 +398,14 @@ impl ImageCache for ImageCacheImpl {
|
|||
fn new(webrender_api: webrender_api::RenderApi) -> ImageCacheImpl {
|
||||
debug!("New image cache");
|
||||
|
||||
let mut placeholder_path = resources_dir_path().expect("Can't figure out resources path.");
|
||||
placeholder_path.push("rippy.png");
|
||||
let rippy_data = resources::read_bytes(Resource::RippyPNG);
|
||||
|
||||
ImageCacheImpl {
|
||||
store: Arc::new(Mutex::new(ImageCacheStore {
|
||||
pending_loads: AllPendingLoads::new(),
|
||||
completed_loads: HashMap::new(),
|
||||
placeholder_image: get_placeholder_image(&webrender_api, &placeholder_path).ok(),
|
||||
placeholder_url: ServoUrl::from_file_path(&placeholder_path).unwrap(),
|
||||
placeholder_image: get_placeholder_image(&webrender_api, &rippy_data).ok(),
|
||||
placeholder_url: ServoUrl::parse("chrome://resources/rippy.png").unwrap(),
|
||||
webrender_api: webrender_api,
|
||||
}))
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ extern crate base64;
|
|||
extern crate brotli;
|
||||
extern crate cookie as cookie_rs;
|
||||
extern crate devtools_traits;
|
||||
extern crate embedder_traits;
|
||||
extern crate flate2;
|
||||
extern crate hyper;
|
||||
extern crate hyper_openssl;
|
||||
|
@ -44,7 +45,6 @@ extern crate webrender_api;
|
|||
extern crate websocket;
|
||||
|
||||
mod blob_loader;
|
||||
mod chrome_loader;
|
||||
pub mod connector;
|
||||
pub mod cookie;
|
||||
pub mod cookie_storage;
|
||||
|
@ -68,7 +68,6 @@ pub mod fetch {
|
|||
|
||||
/// A module for re-exports of items used in unit tests.
|
||||
pub mod test {
|
||||
pub use chrome_loader::resolve_chrome_url;
|
||||
pub use http_loader::HttpState;
|
||||
pub use hosts::{replace_host_table, parse_hostsfile};
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ use cookie;
|
|||
use cookie_rs;
|
||||
use cookie_storage::CookieStorage;
|
||||
use devtools_traits::DevtoolsControlMsg;
|
||||
use embedder_traits::resources::{self, Resource};
|
||||
use fetch::cors_cache::CorsCache;
|
||||
use fetch::methods::{CancellationListener, FetchContext, fetch};
|
||||
use filemanager_thread::{FileManager, TFDProvider};
|
||||
|
@ -31,12 +32,11 @@ use serde::{Deserialize, Serialize};
|
|||
use serde_json;
|
||||
use servo_allocator;
|
||||
use servo_config::opts;
|
||||
use servo_config::resource_files::resources_dir_path;
|
||||
use servo_url::ServoUrl;
|
||||
use std::borrow::{Cow, ToOwned};
|
||||
use std::collections::HashMap;
|
||||
use std::error::Error;
|
||||
use std::fs::File;
|
||||
use std::fs::{self, File};
|
||||
use std::io::prelude::*;
|
||||
use std::ops::Deref;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
@ -118,14 +118,16 @@ fn create_http_states(config_dir: Option<&Path>) -> (Arc<HttpState>, Arc<HttpSta
|
|||
read_json_from_file(&mut cookie_jar, config_dir, "cookie_jar.json");
|
||||
}
|
||||
|
||||
let ca_file = match opts::get().certificate_path {
|
||||
Some(ref path) => PathBuf::from(path),
|
||||
None => resources_dir_path()
|
||||
.expect("Need certificate file to make network requests")
|
||||
.join("certs"),
|
||||
let certs = match opts::get().certificate_path {
|
||||
Some(ref path) => {
|
||||
fs::read_to_string(path).expect("Couldn't not find certificate file")
|
||||
}
|
||||
None => {
|
||||
resources::read_string(Resource::SSLCertificates)
|
||||
},
|
||||
};
|
||||
|
||||
let ssl_client = create_ssl_client(&ca_file);
|
||||
let ssl_client = create_ssl_client(&certs);
|
||||
let http_state = HttpState {
|
||||
cookie_jar: RwLock::new(cookie_jar),
|
||||
auth_cache: RwLock::new(auth_cache),
|
||||
|
@ -136,7 +138,7 @@ fn create_http_states(config_dir: Option<&Path>) -> (Arc<HttpState>, Arc<HttpSta
|
|||
connector: create_http_connector(ssl_client),
|
||||
};
|
||||
|
||||
let private_ssl_client = create_ssl_client(&ca_file);
|
||||
let private_ssl_client = create_ssl_client(&certs);
|
||||
let private_http_state = HttpState::new(private_ssl_client);
|
||||
|
||||
(Arc::new(http_state), Arc::new(private_http_state))
|
||||
|
|
|
@ -1,44 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
use net::test::resolve_chrome_url;
|
||||
use servo_url::ServoUrl;
|
||||
|
||||
fn c(s: &str) -> Result<ServoUrl, ()> {
|
||||
resolve_chrome_url(&ServoUrl::parse(s).unwrap())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_resolve_chrome_url() {
|
||||
assert_eq!(c("chrome://resources/nonexistent.jpg"), Err(()));
|
||||
assert_eq!(c("chrome://not-resources/badcert.jpg"), Err(()));
|
||||
assert_eq!(c("chrome://resources/badcert.jpg").unwrap().scheme(), "file");
|
||||
assert_eq!(c("chrome://resources/subdir/../badcert.jpg").unwrap().scheme(), "file");
|
||||
assert_eq!(c("chrome://resources/subdir/../../badcert.jpg").unwrap().scheme(), "file");
|
||||
assert_eq!(c("chrome://resources/../badcert.jpg").unwrap().scheme(), "file");
|
||||
assert_eq!(c("chrome://resources/../README.md"), Err(()));
|
||||
assert_eq!(c("chrome://resources/%2e%2e/README.md"), Err(()));
|
||||
|
||||
assert_eq!(c("chrome://resources/etc/passwd"), Err(()));
|
||||
assert_eq!(c("chrome://resources//etc/passwd"), Err(()));
|
||||
assert_eq!(c("chrome://resources/%2Fetc%2Fpasswd"), Err(()));
|
||||
|
||||
assert_eq!(c("chrome://resources/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources/C:\\Windows\\notepad.exe"), Err(()));
|
||||
|
||||
assert_eq!(c("chrome://resources/localhost/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources//localhost/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources///localhost/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources/\\\\localhost\\C:\\Windows\\notepad.exe"), Err(()));
|
||||
|
||||
assert_eq!(c("chrome://resources/%3F/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources//%3F/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources///%3F/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources/\\\\%3F\\C:\\Windows\\notepad.exe"), Err(()));
|
||||
|
||||
assert_eq!(c("chrome://resources/%3F/UNC/localhost/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources//%3F/UNC/localhost/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources///%3F/UNC/localhost/C:/Windows/notepad.exe"), Err(()));
|
||||
assert_eq!(c("chrome://resources/\\\\%3F\\UNC\\localhost\\C:\\Windows\\notepad.exe"), Err(()));
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use cookie_rs;
|
||||
use embedder_traits::resources::register_resources_for_tests;
|
||||
use hyper::header::{Header, SetCookie};
|
||||
use net::cookie::Cookie;
|
||||
use net::cookie_storage::CookieStorage;
|
||||
|
@ -56,6 +57,7 @@ fn test_default_path() {
|
|||
#[test]
|
||||
fn fn_cookie_constructor() {
|
||||
use net_traits::CookieSource;
|
||||
register_resources_for_tests();
|
||||
|
||||
let url = &ServoUrl::parse("http://example.com/foo").unwrap();
|
||||
|
||||
|
@ -102,6 +104,7 @@ fn fn_cookie_constructor() {
|
|||
|
||||
#[test]
|
||||
fn test_cookie_secure_prefix() {
|
||||
register_resources_for_tests();
|
||||
let url = &ServoUrl::parse("https://example.com").unwrap();
|
||||
let cookie = cookie_rs::Cookie::parse("__Secure-SID=12345").unwrap();
|
||||
assert!(Cookie::new_wrapped(cookie, url, CookieSource::HTTP).is_none());
|
||||
|
@ -129,6 +132,7 @@ fn test_cookie_secure_prefix() {
|
|||
|
||||
#[test]
|
||||
fn test_cookie_host_prefix() {
|
||||
register_resources_for_tests();
|
||||
let url = &ServoUrl::parse("https://example.com").unwrap();
|
||||
let cookie = cookie_rs::Cookie::parse("__Host-SID=12345").unwrap();
|
||||
assert!(Cookie::new_wrapped(cookie, url, CookieSource::HTTP).is_none());
|
||||
|
@ -182,6 +186,7 @@ fn delay_to_ensure_different_timestamp() {}
|
|||
#[test]
|
||||
fn test_sort_order() {
|
||||
use std::cmp::Ordering;
|
||||
register_resources_for_tests();
|
||||
|
||||
let url = &ServoUrl::parse("http://example.com/foo").unwrap();
|
||||
let a_wrapped = cookie_rs::Cookie::parse("baz=bar; Path=/foo/bar/").unwrap();
|
||||
|
@ -201,6 +206,7 @@ fn test_sort_order() {
|
|||
|
||||
fn add_cookie_to_storage(storage: &mut CookieStorage, url: &ServoUrl, cookie_str: &str)
|
||||
{
|
||||
register_resources_for_tests();
|
||||
let source = CookieSource::HTTP;
|
||||
let cookie = cookie_rs::Cookie::parse(cookie_str.to_owned()).unwrap();
|
||||
let cookie = Cookie::new_wrapped(cookie, url, source).unwrap();
|
||||
|
@ -209,6 +215,7 @@ fn add_cookie_to_storage(storage: &mut CookieStorage, url: &ServoUrl, cookie_str
|
|||
|
||||
#[test]
|
||||
fn test_insecure_cookies_cannot_evict_secure_cookie() {
|
||||
register_resources_for_tests();
|
||||
let mut storage = CookieStorage::new(5);
|
||||
let secure_url = ServoUrl::parse("https://home.example.org:8888/cookie-parser?0001").unwrap();
|
||||
let source = CookieSource::HTTP;
|
||||
|
@ -245,6 +252,7 @@ fn test_insecure_cookies_cannot_evict_secure_cookie() {
|
|||
|
||||
#[test]
|
||||
fn test_secure_cookies_eviction() {
|
||||
register_resources_for_tests();
|
||||
let mut storage = CookieStorage::new(5);
|
||||
let url = ServoUrl::parse("https://home.example.org:8888/cookie-parser?0001").unwrap();
|
||||
let source = CookieSource::HTTP;
|
||||
|
@ -280,6 +288,7 @@ fn test_secure_cookies_eviction() {
|
|||
|
||||
#[test]
|
||||
fn test_secure_cookies_eviction_non_http_source() {
|
||||
register_resources_for_tests();
|
||||
let mut storage = CookieStorage::new(5);
|
||||
let url = ServoUrl::parse("https://home.example.org:8888/cookie-parser?0001").unwrap();
|
||||
let source = CookieSource::NonHTTP;
|
||||
|
@ -341,6 +350,7 @@ fn add_retrieve_cookies(set_location: &str,
|
|||
|
||||
#[test]
|
||||
fn test_cookie_eviction_expired() {
|
||||
register_resources_for_tests();
|
||||
let mut vec = Vec::new();
|
||||
for i in 1..6 {
|
||||
let st = format!("extra{}=bar; Secure; expires=Sun, 18-Apr-2000 21:06:29 GMT",
|
||||
|
@ -356,6 +366,7 @@ fn test_cookie_eviction_expired() {
|
|||
|
||||
#[test]
|
||||
fn test_cookie_eviction_all_secure_one_nonsecure() {
|
||||
register_resources_for_tests();
|
||||
let mut vec = Vec::new();
|
||||
for i in 1..5 {
|
||||
let st = format!("extra{}=bar; Secure; expires=Sun, 18-Apr-2026 21:06:29 GMT",
|
||||
|
@ -372,6 +383,7 @@ fn test_cookie_eviction_all_secure_one_nonsecure() {
|
|||
|
||||
#[test]
|
||||
fn test_cookie_eviction_all_secure_new_nonsecure() {
|
||||
register_resources_for_tests();
|
||||
let mut vec = Vec::new();
|
||||
for i in 1..6 {
|
||||
let st = format!("extra{}=bar; Secure; expires=Sun, 18-Apr-2026 21:06:29 GMT",
|
||||
|
@ -387,6 +399,7 @@ fn test_cookie_eviction_all_secure_new_nonsecure() {
|
|||
|
||||
#[test]
|
||||
fn test_cookie_eviction_all_nonsecure_new_secure() {
|
||||
register_resources_for_tests();
|
||||
let mut vec = Vec::new();
|
||||
for i in 1..6 {
|
||||
let st = format!("extra{}=bar; expires=Sun, 18-Apr-2026 21:06:29 GMT", i);
|
||||
|
@ -401,6 +414,7 @@ fn test_cookie_eviction_all_nonsecure_new_secure() {
|
|||
|
||||
#[test]
|
||||
fn test_cookie_eviction_all_nonsecure_new_nonsecure() {
|
||||
register_resources_for_tests();
|
||||
let mut vec = Vec::new();
|
||||
for i in 1..6 {
|
||||
let st = format!("extra{}=bar; expires=Sun, 18-Apr-2026 21:06:29 GMT", i);
|
||||
|
|
|
@ -6,6 +6,7 @@ use {DEFAULT_USER_AGENT, new_fetch_context, fetch, make_server};
|
|||
use devtools_traits::DevtoolsControlMsg;
|
||||
use devtools_traits::HttpRequest as DevtoolsHttpRequest;
|
||||
use devtools_traits::HttpResponse as DevtoolsHttpResponse;
|
||||
use embedder_traits::resources::register_resources_for_tests;
|
||||
use fetch_with_context;
|
||||
use fetch_with_cors_cache;
|
||||
use http_loader::{expect_devtools_http_request, expect_devtools_http_response};
|
||||
|
@ -34,10 +35,10 @@ use net_traits::NetworkError;
|
|||
use net_traits::ReferrerPolicy;
|
||||
use net_traits::request::{Destination, Origin, RedirectMode, Referrer, Request, RequestMode};
|
||||
use net_traits::response::{CacheState, Response, ResponseBody, ResponseType};
|
||||
use servo_config::resource_files::resources_dir_path;
|
||||
use servo_url::{ImmutableOrigin, ServoUrl};
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::path::Path;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
use std::sync::mpsc::{Sender, channel};
|
||||
|
@ -48,6 +49,7 @@ use unicase::UniCase;
|
|||
|
||||
#[test]
|
||||
fn test_fetch_response_is_not_network_error() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"";
|
||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||
response.send(MESSAGE).unwrap();
|
||||
|
@ -67,6 +69,7 @@ fn test_fetch_response_is_not_network_error() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_on_bad_port_is_network_error() {
|
||||
register_resources_for_tests();
|
||||
let url = ServoUrl::parse("http://www.example.org:6667").unwrap();
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), None);
|
||||
|
@ -79,6 +82,7 @@ fn test_fetch_on_bad_port_is_network_error() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_response_body_matches_const_message() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"Hello World!";
|
||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||
response.send(MESSAGE).unwrap();
|
||||
|
@ -104,6 +108,7 @@ fn test_fetch_response_body_matches_const_message() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_aboutblank() {
|
||||
register_resources_for_tests();
|
||||
let url = ServoUrl::parse("about:blank").unwrap();
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), None);
|
||||
|
@ -115,6 +120,7 @@ fn test_fetch_aboutblank() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_blob() {
|
||||
register_resources_for_tests();
|
||||
use ipc_channel::ipc;
|
||||
use net_traits::blob_url_store::BlobBuf;
|
||||
|
||||
|
@ -155,9 +161,8 @@ fn test_fetch_blob() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_file() {
|
||||
let mut path = resources_dir_path().expect("Cannot find resource dir");
|
||||
path.push("servo.css");
|
||||
|
||||
register_resources_for_tests();
|
||||
let path = Path::new("../../resources/servo.css").canonicalize().unwrap();
|
||||
let url = ServoUrl::from_file_path(path.clone()).unwrap();
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), None);
|
||||
|
@ -183,6 +188,7 @@ fn test_fetch_file() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_ftp() {
|
||||
register_resources_for_tests();
|
||||
let url = ServoUrl::parse("ftp://not-supported").unwrap();
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), None);
|
||||
|
@ -193,6 +199,7 @@ fn test_fetch_ftp() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_bogus_scheme() {
|
||||
register_resources_for_tests();
|
||||
let url = ServoUrl::parse("bogus://whatever").unwrap();
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), None);
|
||||
|
@ -203,6 +210,7 @@ fn test_fetch_bogus_scheme() {
|
|||
|
||||
#[test]
|
||||
fn test_cors_preflight_fetch() {
|
||||
register_resources_for_tests();
|
||||
static ACK: &'static [u8] = b"ACK";
|
||||
let state = Arc::new(AtomicUsize::new(0));
|
||||
let handler = move |request: HyperRequest, mut response: HyperResponse| {
|
||||
|
@ -240,6 +248,7 @@ fn test_cors_preflight_fetch() {
|
|||
|
||||
#[test]
|
||||
fn test_cors_preflight_cache_fetch() {
|
||||
register_resources_for_tests();
|
||||
static ACK: &'static [u8] = b"ACK";
|
||||
let state = Arc::new(AtomicUsize::new(0));
|
||||
let counter = state.clone();
|
||||
|
@ -292,6 +301,7 @@ fn test_cors_preflight_cache_fetch() {
|
|||
|
||||
#[test]
|
||||
fn test_cors_preflight_fetch_network_error() {
|
||||
register_resources_for_tests();
|
||||
static ACK: &'static [u8] = b"ACK";
|
||||
let state = Arc::new(AtomicUsize::new(0));
|
||||
let handler = move |request: HyperRequest, mut response: HyperResponse| {
|
||||
|
@ -322,6 +332,7 @@ fn test_cors_preflight_fetch_network_error() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_response_is_basic_filtered() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"";
|
||||
let handler = move |_: HyperRequest, mut response: HyperResponse| {
|
||||
response.headers_mut().set(SetCookie(vec![]));
|
||||
|
@ -348,6 +359,7 @@ fn test_fetch_response_is_basic_filtered() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_response_is_cors_filtered() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"";
|
||||
let handler = move |_: HyperRequest, mut response: HyperResponse| {
|
||||
// this is mandatory for the Cors Check to pass
|
||||
|
@ -402,6 +414,7 @@ fn test_fetch_response_is_cors_filtered() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_response_is_opaque_filtered() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"";
|
||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||
response.send(MESSAGE).unwrap();
|
||||
|
@ -435,6 +448,7 @@ fn test_fetch_response_is_opaque_filtered() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_response_is_opaque_redirect_filtered() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"";
|
||||
let handler = move |request: HyperRequest, mut response: HyperResponse| {
|
||||
let redirects = match request.uri {
|
||||
|
@ -481,6 +495,7 @@ fn test_fetch_response_is_opaque_redirect_filtered() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_with_local_urls_only() {
|
||||
register_resources_for_tests();
|
||||
// If flag `local_urls_only` is set, fetching a non-local URL must result in network error.
|
||||
|
||||
static MESSAGE: &'static [u8] = b"";
|
||||
|
@ -519,26 +534,24 @@ fn test_fetch_with_local_urls_only() {
|
|||
// And make sure to specify `localhost` as the server name.
|
||||
#[test]
|
||||
fn test_fetch_with_hsts() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"";
|
||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||
response.send(MESSAGE).unwrap();
|
||||
};
|
||||
|
||||
let path = resources_dir_path().expect("Cannot find resource dir");
|
||||
let mut cert_path = path.clone();
|
||||
cert_path.push("self_signed_certificate_for_testing.crt");
|
||||
let cert_path = Path::new("../../resources/self_signed_certificate_for_testing.crt").canonicalize().unwrap();
|
||||
let key_path = Path::new("../../resources/privatekey_for_testing.key").canonicalize().unwrap();
|
||||
|
||||
let mut key_path = path.clone();
|
||||
key_path.push("privatekey_for_testing.key");
|
||||
|
||||
let ssl = hyper_openssl::OpensslServer::from_files(key_path, cert_path)
|
||||
let ssl = hyper_openssl::OpensslServer::from_files(key_path, cert_path.clone())
|
||||
.unwrap();
|
||||
|
||||
//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 ca_file = resources_dir_path().unwrap().join("self_signed_certificate_for_testing.crt");
|
||||
let ssl_client = create_ssl_client(&ca_file);
|
||||
let mut ca_content = String::new();
|
||||
File::open(cert_path).unwrap().read_to_string(&mut ca_content).unwrap();
|
||||
let ssl_client = create_ssl_client(&ca_content);
|
||||
|
||||
let context = FetchContext {
|
||||
state: Arc::new(HttpState::new(ssl_client)),
|
||||
|
@ -568,6 +581,7 @@ fn test_fetch_with_hsts() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_with_sri_network_error() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"alert('Hello, Network Error');";
|
||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||
response.send(MESSAGE).unwrap();
|
||||
|
@ -592,6 +606,7 @@ fn test_fetch_with_sri_network_error() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_with_sri_sucess() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"alert('Hello, world.');";
|
||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||
response.send(MESSAGE).unwrap();
|
||||
|
@ -659,6 +674,7 @@ fn test_fetch_blocked_nosniff() {
|
|||
}
|
||||
|
||||
fn setup_server_and_fetch(message: &'static [u8], redirect_cap: u32) -> Response {
|
||||
register_resources_for_tests();
|
||||
let handler = move |request: HyperRequest, mut response: HyperResponse| {
|
||||
let redirects = match request.uri {
|
||||
RequestUri::AbsolutePath(url) =>
|
||||
|
@ -689,6 +705,7 @@ fn setup_server_and_fetch(message: &'static [u8], redirect_cap: u32) -> Response
|
|||
|
||||
#[test]
|
||||
fn test_fetch_redirect_count_ceiling() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"no more redirects";
|
||||
// how many redirects to cause
|
||||
let redirect_cap = 20;
|
||||
|
@ -708,6 +725,7 @@ fn test_fetch_redirect_count_ceiling() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_redirect_count_failure() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"this message shouldn't be reachable";
|
||||
// how many redirects to cause
|
||||
let redirect_cap = 21;
|
||||
|
@ -773,6 +791,7 @@ fn test_fetch_redirect_updates_method_runner(tx: Sender<bool>, status_code: Stat
|
|||
|
||||
#[test]
|
||||
fn test_fetch_redirect_updates_method() {
|
||||
register_resources_for_tests();
|
||||
let (tx, rx) = channel();
|
||||
|
||||
test_fetch_redirect_updates_method_runner(tx.clone(), StatusCode::MovedPermanently, Method::Post);
|
||||
|
@ -831,6 +850,7 @@ fn response_is_done(response: &Response) -> bool {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_async_returns_complete_response() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"this message should be retrieved in full";
|
||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||
response.send(MESSAGE).unwrap();
|
||||
|
@ -849,6 +869,7 @@ fn test_fetch_async_returns_complete_response() {
|
|||
|
||||
#[test]
|
||||
fn test_opaque_filtered_fetch_async_returns_complete_response() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"";
|
||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||
response.send(MESSAGE).unwrap();
|
||||
|
@ -870,6 +891,7 @@ fn test_opaque_filtered_fetch_async_returns_complete_response() {
|
|||
|
||||
#[test]
|
||||
fn test_opaque_redirect_filtered_fetch_async_returns_complete_response() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"";
|
||||
let handler = move |request: HyperRequest, mut response: HyperResponse| {
|
||||
let redirects = match request.uri {
|
||||
|
@ -906,6 +928,7 @@ fn test_opaque_redirect_filtered_fetch_async_returns_complete_response() {
|
|||
|
||||
#[test]
|
||||
fn test_fetch_with_devtools() {
|
||||
register_resources_for_tests();
|
||||
static MESSAGE: &'static [u8] = b"Yay!";
|
||||
let handler = move |_: HyperRequest, response: HyperResponse| {
|
||||
response.send(MESSAGE).unwrap();
|
||||
|
|
|
@ -176,24 +176,24 @@ fn test_push_entry_to_hsts_list_should_add_an_entry() {
|
|||
|
||||
#[test]
|
||||
fn test_parse_hsts_preload_should_return_none_when_json_invalid() {
|
||||
let mock_preload_content = b"derp";
|
||||
let mock_preload_content = "derp";
|
||||
assert!(HstsList::from_preload(mock_preload_content).is_none(), "invalid preload list should not have parsed")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_hsts_preload_should_return_none_when_json_contains_no_entries_map_key() {
|
||||
let mock_preload_content = b"{\"nothing\": \"to see here\"}";
|
||||
let mock_preload_content = "{\"nothing\": \"to see here\"}";
|
||||
assert!(HstsList::from_preload(mock_preload_content).is_none(), "invalid preload list should not have parsed")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_hsts_preload_should_decode_host_and_includes_subdomains() {
|
||||
let mock_preload_content = b"{\
|
||||
\"entries\": [\
|
||||
{\"host\": \"mozilla.org\",\
|
||||
\"include_subdomains\": false}\
|
||||
]\
|
||||
}";
|
||||
let mock_preload_content = "{\
|
||||
\"entries\": [\
|
||||
{\"host\": \"mozilla.org\",\
|
||||
\"include_subdomains\": false}\
|
||||
]\
|
||||
}";
|
||||
let hsts_list = HstsList::from_preload(mock_preload_content);
|
||||
let entries_map = hsts_list.unwrap().entries_map;
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ use cookie_rs::Cookie as CookiePair;
|
|||
use devtools_traits::{ChromeToDevtoolsControlMsg, DevtoolsControlMsg, NetworkEvent};
|
||||
use devtools_traits::HttpRequest as DevtoolsHttpRequest;
|
||||
use devtools_traits::HttpResponse as DevtoolsHttpResponse;
|
||||
use embedder_traits::resources::register_resources_for_tests;
|
||||
use fetch;
|
||||
use fetch_with_context;
|
||||
use flate2::Compression;
|
||||
|
@ -312,6 +313,7 @@ fn test_request_and_response_message_from_devtool_without_pipeline_id() {
|
|||
|
||||
#[test]
|
||||
fn test_redirected_request_to_devtools() {
|
||||
register_resources_for_tests();
|
||||
let post_handler = move |request: HyperRequest, response: HyperResponse| {
|
||||
assert_eq!(request.method, Method::Get);
|
||||
response.send(b"Yay!").unwrap();
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
extern crate cookie as cookie_rs;
|
||||
extern crate devtools_traits;
|
||||
extern crate embedder_traits;
|
||||
extern crate flate2;
|
||||
extern crate hyper;
|
||||
extern crate hyper_openssl;
|
||||
|
@ -15,13 +16,11 @@ extern crate msg;
|
|||
extern crate net;
|
||||
extern crate net_traits;
|
||||
extern crate profile_traits;
|
||||
extern crate servo_config;
|
||||
extern crate servo_url;
|
||||
extern crate time;
|
||||
extern crate unicase;
|
||||
extern crate url;
|
||||
|
||||
mod chrome_loader;
|
||||
mod cookie;
|
||||
mod cookie_http_state;
|
||||
mod data_loader;
|
||||
|
@ -35,6 +34,7 @@ mod resource_thread;
|
|||
mod subresource_integrity;
|
||||
|
||||
use devtools_traits::DevtoolsControlMsg;
|
||||
use embedder_traits::resources::{self, Resource};
|
||||
use hyper::server::{Handler, Listening, Server};
|
||||
use net::connector::create_ssl_client;
|
||||
use net::fetch::cors_cache::CorsCache;
|
||||
|
@ -44,7 +44,6 @@ use net::test::HttpState;
|
|||
use net_traits::FetchTaskTarget;
|
||||
use net_traits::request::Request;
|
||||
use net_traits::response::Response;
|
||||
use servo_config::resource_files::resources_dir_path;
|
||||
use servo_url::ServoUrl;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::sync::mpsc::{Sender, channel};
|
||||
|
@ -56,8 +55,7 @@ struct FetchResponseCollector {
|
|||
}
|
||||
|
||||
fn new_fetch_context(dc: Option<Sender<DevtoolsControlMsg>>) -> FetchContext {
|
||||
let ca_file = resources_dir_path().unwrap().join("certs");
|
||||
let ssl_client = create_ssl_client(&ca_file);
|
||||
let ssl_client = create_ssl_client(&resources::read_string(Resource::SSLCertificates));
|
||||
FetchContext {
|
||||
state: Arc::new(HttpState::new(ssl_client)),
|
||||
user_agent: DEFAULT_USER_AGENT.into(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue