mirror of
https://github.com/servo/servo.git
synced 2025-08-04 05:00:08 +01:00
Allow XHR to fetch about: and data: URLs.
This was intended to fix #8015 but the tests are all still failing as of this commit.
This commit is contained in:
parent
c4208e67b7
commit
ae56187d48
2 changed files with 14 additions and 5 deletions
|
@ -64,15 +64,22 @@ impl CORSRequest {
|
||||||
destination: Url,
|
destination: Url,
|
||||||
mode: RequestMode,
|
mode: RequestMode,
|
||||||
method: Method,
|
method: Method,
|
||||||
headers: Headers)
|
headers: Headers,
|
||||||
|
same_origin_data_url_flag: bool)
|
||||||
-> Result<Option<CORSRequest>, ()> {
|
-> Result<Option<CORSRequest>, ()> {
|
||||||
if referer.scheme == destination.scheme && referer.host() == destination.host() &&
|
if referer.scheme == destination.scheme && referer.host() == destination.host() &&
|
||||||
referer.port() == destination.port() {
|
referer.port() == destination.port() {
|
||||||
return Ok(None); // Not cross-origin, proceed with a normal fetch
|
return Ok(None); // Not cross-origin, proceed with a normal fetch
|
||||||
}
|
}
|
||||||
match &*destination.scheme {
|
match &*destination.scheme {
|
||||||
// TODO: If the request's same origin data url flag is set (which isn't the case for XHR)
|
// As per (https://fetch.spec.whatwg.org/#main-fetch 5.1.9), about URLs can be fetched
|
||||||
// we can fetch a data URL normally. about:blank can also be fetched by XHR
|
// the same as a basic request.
|
||||||
|
// TODO: (security-sensitive) restrict the available pages to about:blank and
|
||||||
|
// about:unicorn (See https://fetch.spec.whatwg.org/#concept-basic-fetch).
|
||||||
|
"about" => Ok(None),
|
||||||
|
// As per (https://fetch.spec.whatwg.org/#main-fetch 5.1.9), data URLs can be fetched
|
||||||
|
// the same as a basic request if the request's same-origin data-URL flag is set.
|
||||||
|
"data" if same_origin_data_url_flag => Ok(None),
|
||||||
"http" | "https" => {
|
"http" | "https" => {
|
||||||
let mut req = CORSRequest::new(referer, destination, mode, method, headers);
|
let mut req = CORSRequest::new(referer, destination, mode, method, headers);
|
||||||
req.preflight_flag = !is_simple_method(&req.method) ||
|
req.preflight_flag = !is_simple_method(&req.method) ||
|
||||||
|
|
|
@ -626,7 +626,8 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
|
||||||
load_data.url.clone(),
|
load_data.url.clone(),
|
||||||
mode,
|
mode,
|
||||||
load_data.method.clone(),
|
load_data.method.clone(),
|
||||||
combined_headers);
|
combined_headers,
|
||||||
|
true);
|
||||||
match cors_request {
|
match cors_request {
|
||||||
Ok(None) => {
|
Ok(None) => {
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
|
@ -1301,7 +1302,8 @@ impl XMLHttpRequest {
|
||||||
global: GlobalRef) -> ErrorResult {
|
global: GlobalRef) -> ErrorResult {
|
||||||
let cors_request = match cors_request {
|
let cors_request = match cors_request {
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
// Happens in case of cross-origin non-http URIs
|
// Happens in case of unsupported cross-origin URI schemes.
|
||||||
|
// Supported schemes are http, https, data, and about.
|
||||||
self.process_partial_response(XHRProgress::Errored(
|
self.process_partial_response(XHRProgress::Errored(
|
||||||
self.generation_id.get(), Error::Network));
|
self.generation_id.get(), Error::Network));
|
||||||
return Err(Error::Network);
|
return Err(Error::Network);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue