mirror of
https://github.com/servo/servo.git
synced 2025-08-11 16:35:33 +01:00
Auto merge of #15903 - servo:set-origin-header, r=Wafflespeanut
Set Origin header in http_network_or_cache_fetch <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/15903) <!-- Reviewable:end -->
This commit is contained in:
commit
a11a3fe68b
16 changed files with 93 additions and 250 deletions
|
@ -12,8 +12,8 @@ use flate2::Compression;
|
|||
use flate2::write::{DeflateEncoder, GzEncoder};
|
||||
use hyper::LanguageTag;
|
||||
use hyper::header::{Accept, AcceptEncoding, ContentEncoding, ContentLength, Cookie as CookieHeader};
|
||||
use hyper::header::{AcceptLanguage, Authorization, Basic, Date};
|
||||
use hyper::header::{Encoding, Headers, Host, Location, Quality, QualityItem, SetCookie, qitem};
|
||||
use hyper::header::{AcceptLanguage, AccessControlAllowOrigin, Authorization, Basic, Date};
|
||||
use hyper::header::{Encoding, Headers, Host, Location, Origin, Quality, QualityItem, SetCookie, qitem};
|
||||
use hyper::header::{StrictTransportSecurity, UserAgent};
|
||||
use hyper::method::Method;
|
||||
use hyper::mime::{Mime, SubLevel, TopLevel};
|
||||
|
@ -27,12 +27,13 @@ use net::cookie_storage::CookieStorage;
|
|||
use net::resource_thread::AuthCacheEntry;
|
||||
use net_traits::{CookieSource, NetworkError};
|
||||
use net_traits::hosts::replace_host_table;
|
||||
use net_traits::request::{Request, RequestInit, CredentialsMode, Destination};
|
||||
use net_traits::request::{Request, RequestInit, RequestMode, CredentialsMode, Destination};
|
||||
use net_traits::response::ResponseBody;
|
||||
use new_fetch_context;
|
||||
use servo_url::ServoUrl;
|
||||
use std::collections::HashMap;
|
||||
use std::io::{Read, Write};
|
||||
use std::str::FromStr;
|
||||
use std::sync::{Arc, Mutex, RwLock, mpsc};
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use std::sync::mpsc::Receiver;
|
||||
|
@ -145,8 +146,13 @@ fn test_check_default_headers_loaded_in_every_request() {
|
|||
assert!(response.status.unwrap().is_success());
|
||||
|
||||
// Testing for method.POST
|
||||
headers.set(ContentLength(0 as u64));
|
||||
*expected_headers.lock().unwrap() = Some(headers.clone());
|
||||
let mut post_headers = headers.clone();
|
||||
post_headers.set(ContentLength(0 as u64));
|
||||
let url_str = url.as_str();
|
||||
// request gets header "Origin: http://example.com" but expected_headers has
|
||||
// "Origin: http://example.com/" which do not match for equality so strip trailing '/'
|
||||
post_headers.set(Origin::from_str(&url_str[..url_str.len()-1]).unwrap());
|
||||
*expected_headers.lock().unwrap() = Some(post_headers);
|
||||
let request = Request::from_init(RequestInit {
|
||||
url: url.clone(),
|
||||
method: Method::Post,
|
||||
|
@ -1117,3 +1123,61 @@ fn test_auth_ui_needs_www_auth() {
|
|||
|
||||
assert_eq!(response.status.unwrap(), StatusCode::Unauthorized);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_origin_set() {
|
||||
let origin_header = Arc::new(Mutex::new(None));
|
||||
let origin_header_clone = origin_header.clone();
|
||||
let handler = move |request: HyperRequest, mut resp: HyperResponse| {
|
||||
let origin_header_clone = origin_header.clone();
|
||||
resp.headers_mut().set(AccessControlAllowOrigin::Any);
|
||||
match request.headers.get::<Origin>() {
|
||||
None => assert_eq!(origin_header_clone.lock().unwrap().take(), None),
|
||||
Some(h) => assert_eq!(*h, origin_header_clone.lock().unwrap().take().unwrap()),
|
||||
}
|
||||
};
|
||||
let (mut server, url) = make_server(handler);
|
||||
|
||||
let mut origin = Origin::new(url.scheme(), url.host_str().unwrap(), url.port());
|
||||
*origin_header_clone.lock().unwrap() = Some(origin.clone());
|
||||
let request = Request::from_init(RequestInit {
|
||||
url: url.clone(),
|
||||
method: Method::Post,
|
||||
body: None,
|
||||
origin: url.clone(),
|
||||
.. RequestInit::default()
|
||||
});
|
||||
let response = fetch(request, None);
|
||||
assert!(response.status.unwrap().is_success());
|
||||
|
||||
let origin_url = ServoUrl::parse("http://example.com").unwrap();
|
||||
origin = Origin::new(origin_url.scheme(), origin_url.host_str().unwrap(), origin_url.port());
|
||||
// Test Origin header is set on Get request with CORS mode
|
||||
let request = Request::from_init(RequestInit {
|
||||
url: url.clone(),
|
||||
method: Method::Get,
|
||||
mode: RequestMode::CorsMode,
|
||||
body: None,
|
||||
origin: origin_url.clone(),
|
||||
.. RequestInit::default()
|
||||
});
|
||||
|
||||
*origin_header_clone.lock().unwrap() = Some(origin.clone());
|
||||
let response = fetch(request, None);
|
||||
assert!(response.status.unwrap().is_success());
|
||||
|
||||
// Test Origin header is not set on method Head
|
||||
let request = Request::from_init(RequestInit {
|
||||
url: url.clone(),
|
||||
method: Method::Head,
|
||||
body: None,
|
||||
origin: url.clone(),
|
||||
.. RequestInit::default()
|
||||
});
|
||||
|
||||
*origin_header_clone.lock().unwrap() = None;
|
||||
let response = fetch(request, None);
|
||||
assert!(response.status.unwrap().is_success());
|
||||
|
||||
let _ = server.close();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue