mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Provide the fetched data to fetch() consumers.
This commit is contained in:
parent
6bd898626f
commit
cb7e6715fb
9 changed files with 102 additions and 59 deletions
|
@ -36,7 +36,6 @@ use net_traits::request::Request as NetTraitsRequest;
|
|||
use net_traits::request::RequestMode as NetTraitsRequestMode;
|
||||
use net_traits::request::Type as NetTraitsRequestType;
|
||||
use std::cell::{Cell, Ref};
|
||||
use std::mem;
|
||||
use std::rc::Rc;
|
||||
use url::Url;
|
||||
|
||||
|
@ -47,6 +46,8 @@ pub struct Request {
|
|||
body_used: Cell<bool>,
|
||||
headers: MutNullableHeap<JS<Headers>>,
|
||||
mime_type: DOMRefCell<Vec<u8>>,
|
||||
#[ignore_heap_size_of = "Rc"]
|
||||
body_promise: DOMRefCell<Option<(Rc<Promise>, BodyType)>>,
|
||||
}
|
||||
|
||||
impl Request {
|
||||
|
@ -62,6 +63,7 @@ impl Request {
|
|||
body_used: Cell::new(false),
|
||||
headers: Default::default(),
|
||||
mime_type: DOMRefCell::new("".to_string().into_bytes()),
|
||||
body_promise: DOMRefCell::new(None),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -662,20 +664,20 @@ impl BodyOperations for Request {
|
|||
self.BodyUsed()
|
||||
}
|
||||
|
||||
fn set_body_promise(&self, p: &Rc<Promise>, body_type: BodyType) {
|
||||
assert!(self.body_promise.borrow().is_none());
|
||||
self.body_used.set(true);
|
||||
*self.body_promise.borrow_mut() = Some((p.clone(), body_type));
|
||||
}
|
||||
|
||||
fn is_locked(&self) -> bool {
|
||||
self.locked()
|
||||
}
|
||||
|
||||
fn take_body(&self) -> Option<Vec<u8>> {
|
||||
let ref mut net_traits_req = *self.request.borrow_mut();
|
||||
let body: Option<Vec<u8>> = mem::replace(&mut *net_traits_req.body.borrow_mut(), None);
|
||||
match body {
|
||||
Some(_) => {
|
||||
self.body_used.set(true);
|
||||
body
|
||||
},
|
||||
_ => None,
|
||||
}
|
||||
let request = self.request.borrow_mut();
|
||||
let body = request.body.borrow_mut().take();
|
||||
Some(body.unwrap_or(vec![]))
|
||||
}
|
||||
|
||||
fn get_mime_type(&self) -> Ref<Vec<u8>> {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use body::{BodyOperations, BodyType, consume_body};
|
||||
use body::{BodyOperations, BodyType, consume_body, consume_body_with_promise};
|
||||
use core::cell::Cell;
|
||||
use dom::bindings::cell::DOMRefCell;
|
||||
use dom::bindings::codegen::Bindings::HeadersBinding::HeadersMethods;
|
||||
|
@ -44,6 +44,8 @@ pub struct Response {
|
|||
url_list: DOMRefCell<Vec<Url>>,
|
||||
// For now use the existing NetTraitsResponseBody enum
|
||||
body: DOMRefCell<NetTraitsResponseBody>,
|
||||
#[ignore_heap_size_of = "Rc"]
|
||||
body_promise: DOMRefCell<Option<(Rc<Promise>, BodyType)>>,
|
||||
}
|
||||
|
||||
impl Response {
|
||||
|
@ -59,6 +61,7 @@ impl Response {
|
|||
url: DOMRefCell::new(None),
|
||||
url_list: DOMRefCell::new(vec![]),
|
||||
body: DOMRefCell::new(NetTraitsResponseBody::Empty),
|
||||
body_promise: DOMRefCell::new(None),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -194,18 +197,26 @@ impl BodyOperations for Response {
|
|||
self.BodyUsed()
|
||||
}
|
||||
|
||||
fn set_body_promise(&self, p: &Rc<Promise>, body_type: BodyType) {
|
||||
assert!(self.body_promise.borrow().is_none());
|
||||
self.body_used.set(true);
|
||||
*self.body_promise.borrow_mut() = Some((p.clone(), body_type));
|
||||
}
|
||||
|
||||
fn is_locked(&self) -> bool {
|
||||
self.locked()
|
||||
}
|
||||
|
||||
fn take_body(&self) -> Option<Vec<u8>> {
|
||||
let body: NetTraitsResponseBody = mem::replace(&mut *self.body.borrow_mut(), NetTraitsResponseBody::Empty);
|
||||
let body = mem::replace(&mut *self.body.borrow_mut(), NetTraitsResponseBody::Empty);
|
||||
match body {
|
||||
NetTraitsResponseBody::Done(bytes) | NetTraitsResponseBody::Receiving(bytes) => {
|
||||
self.body_used.set(true);
|
||||
NetTraitsResponseBody::Done(bytes) => {
|
||||
Some(bytes)
|
||||
},
|
||||
_ => None,
|
||||
body => {
|
||||
mem::replace(&mut *self.body.borrow_mut(), body);
|
||||
None
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -366,4 +377,12 @@ impl Response {
|
|||
pub fn set_final_url(&self, final_url: Url) {
|
||||
*self.url.borrow_mut() = Some(final_url);
|
||||
}
|
||||
|
||||
#[allow(unrooted_must_root)]
|
||||
pub fn finish(&self, body: Vec<u8>) {
|
||||
*self.body.borrow_mut() = NetTraitsResponseBody::Done(body);
|
||||
if let Some((p, body_type)) = self.body_promise.borrow_mut().take() {
|
||||
consume_body_with_promise(self, body_type, &p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue