diff options
Diffstat (limited to 'components/net/fetch/methods.rs')
-rw-r--r-- | components/net/fetch/methods.rs | 68 |
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 { |