rewrapped Rc<RefCell<Response>> into Rc<Response>

This commit is contained in:
Nikki 2016-01-06 17:03:45 -07:00
parent ba8f007b88
commit c5982872c8
3 changed files with 20 additions and 24 deletions

View file

@ -296,39 +296,37 @@ fn http_fetch(request: Rc<Request>,
authentication_fetch_flag: bool) -> Response { authentication_fetch_flag: bool) -> Response {
// Step 1 // Step 1
let mut response: Option<Rc<RefCell<Response>>> = None; let mut response: Option<Rc<Response>> = None;
// Step 2 // Step 2
let mut actual_response: Option<Rc<RefCell<Response>>> = None; let mut actual_response: Option<Rc<Response>> = None;
// Step 3 // Step 3
if !request.skip_service_worker.get() && !request.is_service_worker_global_scope { if !request.skip_service_worker.get() && !request.is_service_worker_global_scope {
// TODO: Substep 1 (handle fetch unimplemented) // TODO: Substep 1 (handle fetch unimplemented)
if let Some(ref res) = response { if let Some(ref res) = response {
let resp = res.borrow();
// Substep 2 // Substep 2
actual_response = match resp.internal_response { actual_response = match res.internal_response {
Some(ref internal_res) => Some(internal_res.clone()), Some(ref internal_res) => Some(internal_res.clone()),
None => Some(res.clone()) None => Some(res.clone())
}; };
// Substep 3 // Substep 3
if (resp.response_type == ResponseType::Opaque && if (res.response_type == ResponseType::Opaque &&
request.mode != RequestMode::NoCORS) || request.mode != RequestMode::NoCORS) ||
(resp.response_type == ResponseType::OpaqueRedirect && (res.response_type == ResponseType::OpaqueRedirect &&
request.redirect_mode != RedirectMode::Manual) || request.redirect_mode != RedirectMode::Manual) ||
resp.response_type == ResponseType::Error { res.response_type == ResponseType::Error {
return Response::network_error(); return Response::network_error();
} }
} }
// Substep 4 // Substep 4
if let Some(ref res) = actual_response { if let Some(ref res) = actual_response {
let mut resp = res.borrow_mut(); if res.url_list.borrow().is_empty() {
if resp.url_list.is_empty() { *res.url_list.borrow_mut() = request.url_list.borrow().clone();
resp.url_list = request.url_list.borrow().clone();
} }
} }
@ -370,7 +368,7 @@ fn http_fetch(request: Rc<Request>,
if preflight_result.response_type == ResponseType::Error { if preflight_result.response_type == ResponseType::Error {
return Response::network_error(); return Response::network_error();
} }
response = Some(Rc::new(RefCell::new(preflight_result))); response = Some(Rc::new(preflight_result));
} }
} }
@ -394,13 +392,13 @@ fn http_fetch(request: Rc<Request>,
return Response::network_error(); return Response::network_error();
} }
response = Some(Rc::new(RefCell::new(fetch_result))); response = Some(Rc::new(fetch_result));
actual_response = response.clone(); actual_response = response.clone();
} }
// Step 5 // Step 5
let actual_response = Rc::try_unwrap(actual_response.unwrap()).ok().unwrap().into_inner(); let actual_response = Rc::try_unwrap(actual_response.unwrap()).ok().unwrap();
let response = Rc::try_unwrap(response.unwrap()).ok().unwrap(); let mut response = Rc::try_unwrap(response.unwrap()).ok().unwrap();
match actual_response.status.unwrap() { match actual_response.status.unwrap() {
@ -445,7 +443,7 @@ fn http_fetch(request: Rc<Request>,
// Step 9 // Step 9
RedirectMode::Manual => { RedirectMode::Manual => {
*response.borrow_mut() = actual_response.to_filtered(ResponseType::Opaque); response = actual_response.to_filtered(ResponseType::Opaque);
} }
// Step 10 // Step 10
@ -495,7 +493,7 @@ fn http_fetch(request: Rc<Request>,
// Step 1 // Step 1
// FIXME: Figure out what to do with request window objects // FIXME: Figure out what to do with request window objects
if cors_flag { if cors_flag {
return response.into_inner(); return response;
} }
// Step 2 // Step 2
@ -531,8 +529,6 @@ fn http_fetch(request: Rc<Request>,
_ => { } _ => { }
} }
let response = response.into_inner();
// Step 6 // Step 6
if authentication_fetch_flag { if authentication_fetch_flag {
// TODO: Create authentication entry for this request // TODO: Create authentication entry for this request
@ -793,7 +789,7 @@ fn http_network_fetch(request: Rc<Request>,
}; };
// Step 6 // Step 6
response.url_list = request.url_list.borrow().clone(); *response.url_list.borrow_mut() = request.url_list.borrow().clone();
// Step 7 // Step 7

View file

@ -22,7 +22,7 @@ impl ResponseMethods for Response {
response_type: ResponseType::Default, response_type: ResponseType::Default,
termination_reason: None, termination_reason: None,
url: None, url: None,
url_list: Vec::new(), url_list: RefCell::new(Vec::new()),
status: Some(StatusCode::Ok), status: Some(StatusCode::Ok),
headers: Headers::new(), headers: Headers::new(),
body: ResponseBody::Empty, body: ResponseBody::Empty,
@ -42,7 +42,7 @@ impl ResponseMethods for Response {
} }
let old_headers = self.headers.clone(); let old_headers = self.headers.clone();
let mut response = self.clone(); let mut response = self.clone();
response.internal_response = Some(Rc::new(RefCell::new(self))); response.internal_response = Some(Rc::new(self));
match filter_type { match filter_type {
ResponseType::Default | ResponseType::Error => unreachable!(), ResponseType::Default | ResponseType::Error => unreachable!(),
ResponseType::Basic => { ResponseType::Basic => {

View file

@ -67,7 +67,7 @@ pub struct Response {
pub response_type: ResponseType, pub response_type: ResponseType,
pub termination_reason: Option<TerminationReason>, pub termination_reason: Option<TerminationReason>,
pub url: Option<Url>, pub url: Option<Url>,
pub url_list: Vec<Url>, pub url_list: RefCell<Vec<Url>>,
/// `None` can be considered a StatusCode of `0`. /// `None` can be considered a StatusCode of `0`.
pub status: Option<StatusCode>, pub status: Option<StatusCode>,
pub headers: Headers, pub headers: Headers,
@ -76,7 +76,7 @@ pub struct Response {
pub https_state: HttpsState, pub https_state: HttpsState,
/// [Internal response](https://fetch.spec.whatwg.org/#concept-internal-response), only used if the Response /// [Internal response](https://fetch.spec.whatwg.org/#concept-internal-response), only used if the Response
/// is a filtered response /// is a filtered response
pub internal_response: Option<Rc<RefCell<Response>>>, pub internal_response: Option<Rc<Response>>,
} }
impl Response { impl Response {
@ -85,7 +85,7 @@ impl Response {
response_type: ResponseType::Error, response_type: ResponseType::Error,
termination_reason: None, termination_reason: None,
url: None, url: None,
url_list: vec![], url_list: RefCell::new(vec![]),
status: None, status: None,
headers: Headers::new(), headers: Headers::new(),
body: ResponseBody::Empty, body: ResponseBody::Empty,