mirror of
https://github.com/servo/servo.git
synced 2025-08-10 16:05:43 +01:00
Implemented nosniff for fetch algorithm
This commit is contained in:
parent
7cd4c69c40
commit
8aac575019
9 changed files with 172 additions and 79 deletions
|
@ -31,7 +31,7 @@ use net::test::HttpState;
|
|||
use net_traits::IncludeSubdomains;
|
||||
use net_traits::NetworkError;
|
||||
use net_traits::ReferrerPolicy;
|
||||
use net_traits::request::{Origin, RedirectMode, Referrer, Request, RequestMode};
|
||||
use net_traits::request::{Origin, RedirectMode, Referrer, Request, RequestMode, Type};
|
||||
use net_traits::response::{CacheState, Response, ResponseBody, ResponseType};
|
||||
use servo_config::resource_files::resources_dir_path;
|
||||
use servo_url::{ImmutableOrigin, ServoUrl};
|
||||
|
@ -601,6 +601,51 @@ fn test_fetch_with_sri_sucess() {
|
|||
let _ = server.close();
|
||||
assert_eq!(response_is_done(&response), true);
|
||||
}
|
||||
|
||||
/// `fetch` should return a network error if there is a header `X-Content-Type-Options: nosniff`
|
||||
#[test]
|
||||
fn test_fetch_blocked_nosniff() {
|
||||
#[inline]
|
||||
fn test_nosniff_request(request_type: Type,
|
||||
mime: Mime,
|
||||
should_error: bool) {
|
||||
const MESSAGE: &'static [u8] = b"";
|
||||
const HEADER: &'static str = "X-Content-Type-Options";
|
||||
const VALUE: &'static [u8] = b"nosniff";
|
||||
|
||||
let handler = move |_: HyperRequest, mut response: HyperResponse| {
|
||||
let mime_header = ContentType(mime.clone());
|
||||
response.headers_mut().set(mime_header);
|
||||
assert!(response.headers().has::<ContentType>());
|
||||
// Add the nosniff header
|
||||
response.headers_mut().set_raw(HEADER, vec![VALUE.to_vec()]);
|
||||
|
||||
response.send(MESSAGE).unwrap();
|
||||
};
|
||||
|
||||
let (mut server, url) = make_server(handler);
|
||||
|
||||
let origin = Origin::Origin(url.origin());
|
||||
let mut request = Request::new(url, Some(origin), false, None);
|
||||
request.type_ = request_type;
|
||||
let fetch_response = fetch(request, None);
|
||||
let _ = server.close();
|
||||
|
||||
assert_eq!(fetch_response.is_network_error(), should_error);
|
||||
}
|
||||
|
||||
let tests = vec![
|
||||
(Type::Script, Mime(TopLevel::Text, SubLevel::Javascript, vec![]), false),
|
||||
(Type::Script, Mime(TopLevel::Text, SubLevel::Css, vec![]), true),
|
||||
(Type::Style, Mime(TopLevel::Text, SubLevel::Css, vec![]), false),
|
||||
];
|
||||
|
||||
for test in tests {
|
||||
let (type_, mime, should_error) = test;
|
||||
test_nosniff_request(type_, mime, should_error);
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_server_and_fetch(message: &'static [u8], redirect_cap: u32) -> Response {
|
||||
let handler = move |request: HyperRequest, mut response: HyperResponse| {
|
||||
let redirects = match request.uri {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue