aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/fetch/methods.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/net/fetch/methods.rs')
-rw-r--r--components/net/fetch/methods.rs68
1 files changed, 25 insertions, 43 deletions
diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs
index 052e5e31ced..9eedd748c2d 100644
--- a/components/net/fetch/methods.rs
+++ b/components/net/fetch/methods.rs
@@ -25,7 +25,7 @@ use std::mem;
use std::rc::Rc;
use std::sync::mpsc::{Sender, Receiver};
-pub type Target = Option<Box<FetchTaskTarget + Send>>;
+pub type Target<'a> = &'a mut (FetchTaskTarget + Send);
pub enum Data {
Payload(Vec<u8>),
@@ -43,17 +43,15 @@ pub type DoneChannel = Option<(Sender<Data>, Receiver<Data>)>;
/// [Fetch](https://fetch.spec.whatwg.org#concept-fetch)
pub fn fetch(request: Rc<Request>,
- target: &mut Target,
- context: &FetchContext)
- -> Response {
- fetch_with_cors_cache(request, &mut CorsCache::new(), target, context)
+ target: Target,
+ context: &FetchContext) {
+ fetch_with_cors_cache(request, &mut CorsCache::new(), target, context);
}
pub fn fetch_with_cors_cache(request: Rc<Request>,
cache: &mut CorsCache,
- target: &mut Target,
- context: &FetchContext)
- -> Response {
+ target: Target,
+ context: &FetchContext) {
// Step 1
if request.window.get() == Window::Client {
// TODO: Set window to request's client object if client is a Window object
@@ -112,7 +110,7 @@ pub fn fetch_with_cors_cache(request: Rc<Request>,
}
// Step 7
- main_fetch(request, cache, false, false, target, &mut None, &context)
+ main_fetch(request, cache, false, false, target, &mut None, &context);
}
/// [Main fetch](https://fetch.spec.whatwg.org/#concept-main-fetch)
@@ -120,7 +118,7 @@ pub fn main_fetch(request: Rc<Request>,
cache: &mut CorsCache,
cors_flag: bool,
recursive_flag: bool,
- target: &mut Target,
+ target: Target,
done_chan: &mut DoneChannel,
context: &FetchContext)
-> Response {
@@ -297,20 +295,16 @@ pub fn main_fetch(request: Rc<Request>,
// Step 19
if request.synchronous {
- if let Some(ref mut target) = *target {
- // process_response is not supposed to be used
- // by sync fetch, but we overload it here for simplicity
- target.process_response(&response);
- }
+ // process_response is not supposed to be used
+ // by sync fetch, but we overload it here for simplicity
+ target.process_response(&response);
if let Some(ref ch) = *done_chan {
loop {
match ch.1.recv()
.expect("fetch worker should always send Done before terminating") {
Data::Payload(vec) => {
- if let Some(ref mut target) = *target {
- target.process_response_chunk(vec);
- }
+ target.process_response_chunk(vec);
}
Data::Done => break,
}
@@ -321,37 +315,29 @@ pub fn main_fetch(request: Rc<Request>,
// in case there was no channel to wait for, the body was
// obtained synchronously via basic_fetch for data/file/about/etc
// We should still send the body across as a chunk
- if let Some(ref mut target) = *target {
- target.process_response_chunk(vec.clone());
- }
+ target.process_response_chunk(vec.clone());
} else {
assert!(*body == ResponseBody::Empty)
}
}
// overloaded similarly to process_response
- if let Some(ref mut target) = *target {
- target.process_response_eof(&response);
- }
+ target.process_response_eof(&response);
return response;
}
// Step 20
if request.body.borrow().is_some() && matches!(request.current_url().scheme(), "http" | "https") {
- if let Some(ref mut target) = *target {
- // XXXManishearth: We actually should be calling process_request
- // in http_network_fetch. However, we can't yet follow the request
- // upload progress, so I'm keeping it here for now and pretending
- // the body got sent in one chunk
- target.process_request_body(&request);
- target.process_request_eof(&request);
- }
+ // XXXManishearth: We actually should be calling process_request
+ // in http_network_fetch. However, we can't yet follow the request
+ // upload progress, so I'm keeping it here for now and pretending
+ // the body got sent in one chunk
+ target.process_request_body(&request);
+ target.process_request_eof(&request);
}
// Step 21
- if let Some(ref mut target) = *target {
- target.process_response(&response);
- }
+ target.process_response(&response);
// Step 22
if let Some(ref ch) = *done_chan {
@@ -359,14 +345,12 @@ pub fn main_fetch(request: Rc<Request>,
match ch.1.recv()
.expect("fetch worker should always send Done before terminating") {
Data::Payload(vec) => {
- if let Some(ref mut target) = *target {
- target.process_response_chunk(vec);
- }
+ target.process_response_chunk(vec);
}
Data::Done => break,
}
}
- } else if let Some(ref mut target) = *target {
+ } else {
let body = response.body.lock().unwrap();
if let ResponseBody::Done(ref vec) = *body {
// in case there was no channel to wait for, the body was
@@ -379,9 +363,7 @@ pub fn main_fetch(request: Rc<Request>,
}
// Step 24
- if let Some(ref mut target) = *target {
- target.process_response_eof(&response);
- }
+ target.process_response_eof(&response);
// TODO remove this line when only asynchronous fetches are used
return response;
@@ -390,7 +372,7 @@ pub fn main_fetch(request: Rc<Request>,
/// [Basic fetch](https://fetch.spec.whatwg.org#basic-fetch)
fn basic_fetch(request: Rc<Request>,
cache: &mut CorsCache,
- target: &mut Target,
+ target: Target,
done_chan: &mut DoneChannel,
context: &FetchContext)
-> Response {