aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xmlhttprequest.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/xmlhttprequest.rs')
-rw-r--r--components/script/dom/xmlhttprequest.rs119
1 files changed, 62 insertions, 57 deletions
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index a5d5c767a72..62a42ec3cf6 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -34,8 +34,9 @@ use encoding::types::{DecoderTrap, Encoding, EncodingRef, EncoderTrap};
use hyper::header::Headers;
use hyper::header::common::{Accept, ContentLength, ContentType};
+use hyper::header::quality_item::QualityItem;
use hyper::http::RawStatus;
-use hyper::mime::{mod, Mime};
+use hyper::mime::{self, Mime};
use hyper::method::Method;
use js::jsapi::{JS_ParseJSON, JSContext};
@@ -50,8 +51,9 @@ use servo_util::str::DOMString;
use servo_util::task::spawn_named;
use std::ascii::AsciiExt;
+use std::borrow::ToOwned;
use std::cell::Cell;
-use std::comm::{Sender, Receiver, channel};
+use std::sync::mpsc::{Sender, Receiver, channel};
use std::default::Default;
use std::io::Timer;
use std::str::FromStr;
@@ -63,7 +65,7 @@ use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams;
use dom::bindings::codegen::UnionTypes::StringOrURLSearchParams::{eString, eURLSearchParams};
pub type SendParam = StringOrURLSearchParams;
-#[deriving(PartialEq, Copy)]
+#[derive(PartialEq, Copy)]
#[jstraceable]
enum XMLHttpRequestState {
Unsent = 0,
@@ -91,11 +93,11 @@ impl Runnable for XHRProgressHandler {
}
}
-#[deriving(PartialEq, Clone, Copy)]
+#[derive(PartialEq, Clone, Copy)]
#[jstraceable]
pub struct GenerationId(uint);
-#[deriving(Clone)]
+#[derive(Clone)]
pub enum XHRProgress {
/// Notify that headers have been received
HeadersReceived(GenerationId, Option<Headers>, Option<RawStatus>),
@@ -168,7 +170,7 @@ impl XMLHttpRequest {
timeout: Cell::new(0u32),
with_credentials: Cell::new(false),
upload: JS::from_rooted(XMLHttpRequestUpload::new(global)),
- response_url: "".into_string(),
+ response_url: "".to_owned(),
status: Cell::new(0),
status_text: DOMRefCell::new(ByteString::new(vec!())),
response: DOMRefCell::new(ByteString::new(vec!())),
@@ -229,7 +231,7 @@ impl XMLHttpRequest {
notify_partial_progress(fetch_type, XHRProgress::Errored(gen_id, $err));
return Err($err)
});
- )
+ );
macro_rules! terminate(
($reason:expr) => (
@@ -242,7 +244,7 @@ impl XMLHttpRequest {
}
}
);
- )
+ );
match cors_request {
@@ -256,13 +258,14 @@ impl XMLHttpRequest {
let req2 = req.clone();
// TODO: this exists only to make preflight check non-blocking
// perhaps should be handled by the resource_loader?
- spawn_named("XHR:Cors", proc() {
+ spawn_named("XHR:Cors".to_owned(), move || {
let response = req2.http_fetch();
chan.send(response);
});
select! (
response = cors_port.recv() => {
+ let response = response.unwrap();
if response.network_error {
notify_error_and_return!(Network);
} else {
@@ -272,8 +275,8 @@ impl XMLHttpRequest {
});
}
},
- reason = terminate_receiver.recv() => terminate!(reason)
- )
+ reason = terminate_receiver.recv() => terminate!(reason.unwrap())
+ );
}
_ => {}
}
@@ -285,6 +288,7 @@ impl XMLHttpRequest {
let progress_port;
select! (
response = start_port.recv() => {
+ let response = response.unwrap();
match cors_request {
Ok(Some(ref req)) => {
match response.metadata.headers {
@@ -301,8 +305,8 @@ impl XMLHttpRequest {
progress_port = response.progress_port;
},
- reason = terminate_receiver.recv() => terminate!(reason)
- )
+ reason = terminate_receiver.recv() => terminate!(reason.unwrap())
+ );
let mut buf = vec!();
loop {
@@ -318,7 +322,7 @@ impl XMLHttpRequest {
};
select! (
- progress = progress_port.recv() => match progress {
+ progress = progress_port.recv() => match progress.unwrap() {
Payload(data) => {
buf.push_all(data.as_slice());
notify_partial_progress(fetch_type,
@@ -332,14 +336,14 @@ impl XMLHttpRequest {
notify_error_and_return!(Network);
}
},
- reason = terminate_receiver.recv() => terminate!(reason)
- )
+ reason = terminate_receiver.recv() => terminate!(reason.unwrap())
+ );
}
}
}
impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
- event_handler!(readystatechange, GetOnreadystatechange, SetOnreadystatechange)
+ event_handler!(readystatechange, GetOnreadystatechange, SetOnreadystatechange);
fn ReadyState(self) -> u16 {
self.ready_state.get() as u16
@@ -353,12 +357,12 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
// without changing capitalization, this will actually sidestep rust-http's type system
// since methods like "patch" or "PaTcH" will be considered extension methods
// despite the there being a rust-http method variant for them
- let upper = s.to_ascii_upper();
+ let upper = s.to_ascii_uppercase();
match upper.as_slice() {
"DELETE" | "GET" | "HEAD" | "OPTIONS" |
"POST" | "PUT" | "CONNECT" | "TRACE" |
- "TRACK" => from_str(upper.as_slice()),
- _ => from_str(s)
+ "TRACK" => upper.parse(),
+ _ => s.parse()
}
});
// Step 2
@@ -437,24 +441,24 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
None => return Err(Syntax)
};
- debug!("SetRequestHeader: name={}, value={}", name.as_str(), value.as_str());
+ debug!("SetRequestHeader: name={:?}, value={:?}", name.as_str(), value.as_str());
let mut headers = self.request_headers.borrow_mut();
// Steps 6,7
match headers.get_raw(name_str) {
Some(raw) => {
- debug!("SetRequestHeader: old value = {}", raw[0]);
+ debug!("SetRequestHeader: old value = {:?}", raw[0]);
let mut buf = raw[0].clone();
buf.push_all(b", ");
buf.push_all(value.as_slice());
- debug!("SetRequestHeader: new value = {}", buf);
+ debug!("SetRequestHeader: new value = {:?}", buf);
value = ByteString::new(buf);
},
None => {}
}
- headers.set_raw(name_str.into_string(), vec![value.as_slice().to_vec()]);
+ headers.set_raw(name_str.to_owned(), vec![value.as_slice().to_vec()]);
Ok(())
}
fn Timeout(self) -> u32 {
@@ -525,12 +529,12 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
// If one of the event handlers below aborts the fetch by calling
// abort or open we will need the current generation id to detect it.
let gen_id = self.generation_id.get();
- self.dispatch_response_progress_event("loadstart".into_string());
+ self.dispatch_response_progress_event("loadstart".to_owned());
if self.generation_id.get() != gen_id {
return Ok(());
}
if !self.upload_complete.get() {
- self.dispatch_upload_progress_event("loadstart".into_string(), Some(0));
+ self.dispatch_upload_progress_event("loadstart".to_owned(), Some(0));
if self.generation_id.get() != gen_id {
return Ok(());
}
@@ -562,18 +566,19 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
let n = "content-type";
match data {
Some(eString(_)) =>
- request_headers.set_raw(n.into_string(), vec![join_raw("text/plain", params)]),
+ request_headers.set_raw(n.to_owned(), vec![join_raw("text/plain", params)]),
Some(eURLSearchParams(_)) =>
request_headers.set_raw(
- n.into_string(), vec![join_raw("application/x-www-form-urlencoded", params)]),
+ n.to_owned(), vec![join_raw("application/x-www-form-urlencoded", params)]),
None => ()
}
}
if !request_headers.has::<Accept>() {
+ let mime = Mime(mime::TopLevel::Star, mime::SubLevel::Star, vec![]);
request_headers.set(
- Accept(vec![Mime(mime::TopLevel::Star, mime::SubLevel::Star, vec![])]));
+ Accept(vec![QualityItem::new(mime, 1.0)]));
}
} // drops the borrow_mut
@@ -602,14 +607,14 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
buf.push_str(format!("{}", p).as_slice());
});
referer_url.serialize_path().map(|ref h| buf.push_str(h.as_slice()));
- self.request_headers.borrow_mut().set_raw("Referer".into_string(), vec![buf.into_bytes()]);
+ self.request_headers.borrow_mut().set_raw("Referer".to_owned(), vec![buf.into_bytes()]);
},
- Ok(Some(ref req)) => self.insert_trusted_header("origin".into_string(),
+ Ok(Some(ref req)) => self.insert_trusted_header("origin".to_owned(),
format!("{}", req.origin)),
_ => {}
}
- debug!("request_headers = {}", *self.request_headers.borrow());
+ debug!("request_headers = {:?}", *self.request_headers.borrow());
let gen_id = self.generation_id.get();
if self.sync.get() {
@@ -623,7 +628,7 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
// inflight events queued up in the script task's port.
let addr = Trusted::new(self.global.root().r().get_cx(), self,
script_chan.clone());
- spawn_named("XHRTask", proc() {
+ spawn_named("XHRTask".to_owned(), move || {
let _ = XMLHttpRequest::fetch(&mut SyncOrAsync::Async(addr, script_chan),
resource_task,
load_data,
@@ -705,7 +710,7 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
},
_ if self.ready_state.get() != XMLHttpRequestState::XHRDone => NullValue(),
Json => {
- let decoded = UTF_8.decode(self.response.borrow().as_slice(), DecoderTrap::Replace).unwrap().into_string();
+ let decoded = UTF_8.decode(self.response.borrow().as_slice(), DecoderTrap::Replace).unwrap().to_owned();
let decoded: Vec<u16> = decoded.as_slice().utf16_units().collect();
let mut vp = UndefinedValue();
unsafe {
@@ -727,7 +732,7 @@ impl<'a> XMLHttpRequestMethods for JSRef<'a, XMLHttpRequest> {
_empty | Text => {
match self.ready_state.get() {
XMLHttpRequestState::Loading | XMLHttpRequestState::XHRDone => Ok(self.text_response()),
- _ => Ok("".into_string())
+ _ => Ok("".to_owned())
}
},
_ => Err(InvalidState)
@@ -766,11 +771,11 @@ trait PrivateXMLHttpRequestHelpers {
impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
fn change_ready_state(self, rs: XMLHttpRequestState) {
- assert!(self.ready_state.get() != rs)
+ assert!(self.ready_state.get() != rs);
self.ready_state.set(rs);
let global = self.global.root();
let event = Event::new(global.r(),
- "readystatechange".into_string(),
+ "readystatechange".to_owned(),
EventBubbles::DoesNotBubble,
EventCancelable::Cancelable).root();
let target: JSRef<EventTarget> = EventTargetCast::from_ref(self);
@@ -788,7 +793,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
return
}
);
- )
+ );
// Ignore message if it belongs to a terminated fetch
return_if_fetch_was_terminated!();
@@ -804,11 +809,11 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
self.upload_complete.set(true);
// Substeps 2-4
if !self.sync.get() {
- self.dispatch_upload_progress_event("progress".into_string(), None);
+ self.dispatch_upload_progress_event("progress".to_owned(), None);
return_if_fetch_was_terminated!();
- self.dispatch_upload_progress_event("load".into_string(), None);
+ self.dispatch_upload_progress_event("load".to_owned(), None);
return_if_fetch_was_terminated!();
- self.dispatch_upload_progress_event("loadend".into_string(), None);
+ self.dispatch_upload_progress_event("loadend".to_owned(), None);
return_if_fetch_was_terminated!();
}
// Part of step 13, send() (processing response)
@@ -836,7 +841,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
self.change_ready_state(XMLHttpRequestState::Loading);
return_if_fetch_was_terminated!();
}
- self.dispatch_response_progress_event("progress".into_string());
+ self.dispatch_response_progress_event("progress".to_owned());
}
},
XHRProgress::Done(_) => {
@@ -852,11 +857,11 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
self.change_ready_state(XMLHttpRequestState::XHRDone);
return_if_fetch_was_terminated!();
// Subsubsteps 10-12
- self.dispatch_response_progress_event("progress".into_string());
+ self.dispatch_response_progress_event("progress".to_owned());
return_if_fetch_was_terminated!();
- self.dispatch_response_progress_event("load".into_string());
+ self.dispatch_response_progress_event("load".to_owned());
return_if_fetch_was_terminated!();
- self.dispatch_response_progress_event("loadend".into_string());
+ self.dispatch_response_progress_event("loadend".to_owned());
},
XHRProgress::Errored(_, e) => {
self.send_flag.set(false);
@@ -873,18 +878,18 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
let upload_complete: &Cell<bool> = &self.upload_complete;
if !upload_complete.get() {
upload_complete.set(true);
- self.dispatch_upload_progress_event("progress".into_string(), None);
+ self.dispatch_upload_progress_event("progress".to_owned(), None);
return_if_fetch_was_terminated!();
- self.dispatch_upload_progress_event(errormsg.into_string(), None);
+ self.dispatch_upload_progress_event(errormsg.to_owned(), None);
return_if_fetch_was_terminated!();
- self.dispatch_upload_progress_event("loadend".into_string(), None);
+ self.dispatch_upload_progress_event("loadend".to_owned(), None);
return_if_fetch_was_terminated!();
}
- self.dispatch_response_progress_event("progress".into_string());
+ self.dispatch_response_progress_event("progress".to_owned());
return_if_fetch_was_terminated!();
- self.dispatch_response_progress_event(errormsg.into_string());
+ self.dispatch_response_progress_event(errormsg.to_owned());
return_if_fetch_was_terminated!();
- self.dispatch_response_progress_event("loadend".into_string());
+ self.dispatch_response_progress_event("loadend".to_owned());
}
}
}
@@ -892,7 +897,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
fn terminate_ongoing_fetch(self) {
let GenerationId(prev_id) = self.generation_id.get();
self.generation_id.set(GenerationId(prev_id + 1));
- self.terminate_sender.borrow().as_ref().map(|s| s.send_opt(TerminateReason::AbortedOrReopened));
+ self.terminate_sender.borrow().as_ref().map(|s| s.send(TerminateReason::AbortedOrReopened));
}
fn insert_trusted_header(self, name: String, value: String) {
@@ -935,10 +940,10 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
let oneshot = self.timer.borrow_mut()
.oneshot(Duration::milliseconds(timeout as i64));
let terminate_sender = (*self.terminate_sender.borrow()).clone();
- spawn_named("XHR:Timer", proc () {
- match oneshot.recv_opt() {
+ spawn_named("XHR:Timer".to_owned(), move || {
+ match oneshot.recv() {
Ok(_) => {
- terminate_sender.map(|s| s.send_opt(TerminateReason::TimedOut));
+ terminate_sender.map(|s| s.send(TerminateReason::TimedOut));
},
Err(_) => {
// This occurs if xhr.timeout (the sender) goes out of scope (i.e, xhr went out of scope)
@@ -970,7 +975,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
// According to Simon, decode() should never return an error, so unwrap()ing
// the result should be fine. XXXManishearth have a closer look at this later
- encoding.decode(self.response.borrow().as_slice(), DecoderTrap::Replace).unwrap().into_string()
+ encoding.decode(self.response.borrow().as_slice(), DecoderTrap::Replace).unwrap().to_owned()
}
fn filter_response_headers(self) -> Headers {
// http://fetch.spec.whatwg.org/#concept-response-header-list
@@ -979,7 +984,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
use hyper::header::common::SetCookie;
// a dummy header so we can use headers.remove::<SetCookie2>()
- #[deriving(Clone)]
+ #[derive(Clone)]
struct SetCookie2;
impl Header for SetCookie2 {
fn header_name(_: Option<SetCookie2>) -> &'static str {