diff options
Diffstat (limited to 'components/script/dom/xmlhttprequest.rs')
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 119 |
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 { |