mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Make fetch take a &Request
This commit is contained in:
parent
9601a66b60
commit
f42a63baea
7 changed files with 87 additions and 91 deletions
|
@ -27,7 +27,6 @@ use std::fmt;
|
|||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::mem;
|
||||
use std::rc::Rc;
|
||||
use std::str;
|
||||
use std::sync::mpsc::{Sender, Receiver};
|
||||
use subresource_integrity::is_response_integrity_valid;
|
||||
|
@ -49,13 +48,13 @@ pub struct FetchContext {
|
|||
pub type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>;
|
||||
|
||||
/// [Fetch](https://fetch.spec.whatwg.org#concept-fetch)
|
||||
pub fn fetch(request: Rc<Request>,
|
||||
pub fn fetch(request: &Request,
|
||||
target: Target,
|
||||
context: &FetchContext) {
|
||||
fetch_with_cors_cache(request, &mut CorsCache::new(), target, context);
|
||||
}
|
||||
|
||||
pub fn fetch_with_cors_cache(request: Rc<Request>,
|
||||
pub fn fetch_with_cors_cache(request: &Request,
|
||||
cache: &mut CorsCache,
|
||||
target: Target,
|
||||
context: &FetchContext) {
|
||||
|
@ -121,7 +120,7 @@ pub fn fetch_with_cors_cache(request: Rc<Request>,
|
|||
}
|
||||
|
||||
/// [Main fetch](https://fetch.spec.whatwg.org/#concept-main-fetch)
|
||||
pub fn main_fetch(request: Rc<Request>,
|
||||
pub fn main_fetch(request: &Request,
|
||||
cache: &mut CorsCache,
|
||||
cors_flag: bool,
|
||||
recursive_flag: bool,
|
||||
|
@ -216,14 +215,14 @@ pub fn main_fetch(request: Rc<Request>,
|
|||
current_url.scheme() == "file" ||
|
||||
current_url.scheme() == "about" ||
|
||||
request.mode == RequestMode::Navigate {
|
||||
basic_fetch(request.clone(), cache, target, done_chan, context)
|
||||
basic_fetch(request, cache, target, done_chan, context)
|
||||
|
||||
} else if request.mode == RequestMode::SameOrigin {
|
||||
Response::network_error(NetworkError::Internal("Cross-origin response".into()))
|
||||
|
||||
} else if request.mode == RequestMode::NoCors {
|
||||
request.response_tainting.set(ResponseTainting::Opaque);
|
||||
basic_fetch(request.clone(), cache, target, done_chan, context)
|
||||
basic_fetch(request, cache, target, done_chan, context)
|
||||
|
||||
} else if !matches!(current_url.scheme(), "http" | "https") {
|
||||
Response::network_error(NetworkError::Internal("Non-http scheme".into()))
|
||||
|
@ -233,7 +232,7 @@ pub fn main_fetch(request: Rc<Request>,
|
|||
(!is_simple_method(&request.method.borrow()) ||
|
||||
request.headers.borrow().iter().any(|h| !is_simple_header(&h)))) {
|
||||
request.response_tainting.set(ResponseTainting::CorsTainting);
|
||||
let response = http_fetch(request.clone(), cache, true, true, false,
|
||||
let response = http_fetch(request, cache, true, true, false,
|
||||
target, done_chan, context);
|
||||
if response.is_network_error() {
|
||||
// TODO clear cache entries using request
|
||||
|
@ -242,7 +241,7 @@ pub fn main_fetch(request: Rc<Request>,
|
|||
|
||||
} else {
|
||||
request.response_tainting.set(ResponseTainting::CorsTainting);
|
||||
http_fetch(request.clone(), cache, true, false, false, target, done_chan, context)
|
||||
http_fetch(request, cache, true, false, false, target, done_chan, context)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -397,7 +396,7 @@ fn wait_for_response(response: &Response, target: Target, done_chan: &mut DoneCh
|
|||
}
|
||||
|
||||
/// [Basic fetch](https://fetch.spec.whatwg.org#basic-fetch)
|
||||
fn basic_fetch(request: Rc<Request>,
|
||||
fn basic_fetch(request: &Request,
|
||||
cache: &mut CorsCache,
|
||||
target: Target,
|
||||
done_chan: &mut DoneChannel,
|
||||
|
@ -414,7 +413,7 @@ fn basic_fetch(request: Rc<Request>,
|
|||
},
|
||||
|
||||
"http" | "https" => {
|
||||
http_fetch(request.clone(), cache, false, false, false, target, done_chan, context)
|
||||
http_fetch(request, cache, false, false, false, target, done_chan, context)
|
||||
},
|
||||
|
||||
"data" => {
|
||||
|
|
|
@ -44,7 +44,6 @@ use std::io::{self, Read, Write};
|
|||
use std::iter::FromIterator;
|
||||
use std::mem;
|
||||
use std::ops::Deref;
|
||||
use std::rc::Rc;
|
||||
use std::sync::{Arc, RwLock};
|
||||
use std::sync::mpsc::{channel, Sender};
|
||||
use std::thread;
|
||||
|
@ -477,7 +476,7 @@ fn obtain_response(request_factory: &NetworkHttpRequestFactory,
|
|||
}
|
||||
|
||||
/// [HTTP fetch](https://fetch.spec.whatwg.org#http-fetch)
|
||||
pub fn http_fetch(request: Rc<Request>,
|
||||
pub fn http_fetch(request: &Request,
|
||||
cache: &mut CorsCache,
|
||||
cors_flag: bool,
|
||||
cors_preflight_flag: bool,
|
||||
|
@ -554,7 +553,7 @@ pub fn http_fetch(request: Rc<Request>,
|
|||
request.skip_service_worker.set(true);
|
||||
|
||||
// Substep 3
|
||||
let fetch_result = http_network_or_cache_fetch(request.clone(), authentication_fetch_flag,
|
||||
let fetch_result = http_network_or_cache_fetch(request, authentication_fetch_flag,
|
||||
cors_flag, done_chan, context);
|
||||
|
||||
// Substep 4
|
||||
|
@ -649,7 +648,7 @@ pub fn http_fetch(request: Rc<Request>,
|
|||
}
|
||||
|
||||
/// [HTTP redirect fetch](https://fetch.spec.whatwg.org#http-redirect-fetch)
|
||||
fn http_redirect_fetch(request: Rc<Request>,
|
||||
fn http_redirect_fetch(request: &Request,
|
||||
cache: &mut CorsCache,
|
||||
response: Response,
|
||||
cors_flag: bool,
|
||||
|
@ -738,7 +737,7 @@ fn try_immutable_origin_to_hyper_origin(url_origin: &ImmutableOrigin) -> Option<
|
|||
}
|
||||
|
||||
/// [HTTP network or cache fetch](https://fetch.spec.whatwg.org#http-network-or-cache-fetch)
|
||||
fn http_network_or_cache_fetch(request: Rc<Request>,
|
||||
fn http_network_or_cache_fetch(request: &Request,
|
||||
authentication_fetch_flag: bool,
|
||||
cors_flag: bool,
|
||||
done_chan: &mut DoneChannel,
|
||||
|
@ -748,13 +747,15 @@ fn http_network_or_cache_fetch(request: Rc<Request>,
|
|||
let request_has_no_window = true;
|
||||
|
||||
// Step 2
|
||||
let http_request;
|
||||
let http_request = if request_has_no_window &&
|
||||
request.redirect_mode.get() == RedirectMode::Error {
|
||||
request
|
||||
} else {
|
||||
// Step 3
|
||||
// TODO Implement body source
|
||||
Rc::new((*request).clone())
|
||||
http_request = request.clone();
|
||||
&http_request
|
||||
};
|
||||
|
||||
// Step 4
|
||||
|
@ -943,7 +944,7 @@ fn http_network_or_cache_fetch(request: Rc<Request>,
|
|||
NetworkError::Internal("Couldn't find response in cache".into()))
|
||||
}
|
||||
// Substep 2
|
||||
let forward_response = http_network_fetch(http_request.clone(), credentials_flag,
|
||||
let forward_response = http_network_fetch(http_request, credentials_flag,
|
||||
done_chan, context);
|
||||
match forward_response.raw_status {
|
||||
// Substep 3
|
||||
|
@ -1033,7 +1034,7 @@ fn http_network_or_cache_fetch(request: Rc<Request>,
|
|||
}
|
||||
|
||||
/// [HTTP network fetch](https://fetch.spec.whatwg.org/#http-network-fetch)
|
||||
fn http_network_fetch(request: Rc<Request>,
|
||||
fn http_network_fetch(request: &Request,
|
||||
credentials_flag: bool,
|
||||
done_chan: &mut DoneChannel,
|
||||
context: &FetchContext)
|
||||
|
@ -1234,8 +1235,7 @@ fn cors_preflight_fetch(request: &Request,
|
|||
AccessControlRequestHeaders(value));
|
||||
|
||||
// Step 6
|
||||
let preflight = Rc::new(preflight);
|
||||
let response = http_network_or_cache_fetch(preflight.clone(), false, false, &mut None, context);
|
||||
let response = http_network_or_cache_fetch(&preflight, false, false, &mut None, context);
|
||||
|
||||
// Step 7
|
||||
if cors_check(&request, &response).is_ok() &&
|
||||
|
|
|
@ -33,7 +33,6 @@ use std::fs::File;
|
|||
use std::io::prelude::*;
|
||||
use std::ops::Deref;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::rc::Rc;
|
||||
use std::sync::{Arc, RwLock};
|
||||
use std::sync::mpsc::Sender;
|
||||
use std::thread;
|
||||
|
@ -350,7 +349,7 @@ impl CoreResourceManager {
|
|||
devtools_chan: dc,
|
||||
filemanager: filemanager,
|
||||
};
|
||||
fetch(Rc::new(request), &mut sender, &context);
|
||||
fetch(&request, &mut sender, &context);
|
||||
}).expect("Thread spawning failed");
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue