diff options
author | Daniel Robertson <danlrobertson89@gmail.com> | 2016-02-13 01:00:23 +0000 |
---|---|---|
committer | Daniel Robertson <danlrobertson89@gmail.com> | 2016-02-15 04:57:24 +0000 |
commit | 10e7af50fef1aad7571748fa620a7b9d21c00d44 (patch) | |
tree | 5c0b6b9f7a6839f37433304439dae300711ae338 /components/script/dom/xmlhttprequest.rs | |
parent | 3f74c07e2025671d867e94acd28e706ce6fe236e (diff) | |
download | servo-10e7af50fef1aad7571748fa620a7b9d21c00d44.tar.gz servo-10e7af50fef1aad7571748fa620a7b9d21c00d44.zip |
Implement step 9 of XHR open method
Implement step 9 of the Open method for XMLHttpRequest.
Diffstat (limited to 'components/script/dom/xmlhttprequest.rs')
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index d81bfe4ab7c..0f0fbecf66f 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -60,6 +60,7 @@ use string_cache::Atom; use time; use timers::{ScheduledCallback, TimerHandle}; use url::Url; +use url::percent_encoding::{utf8_percent_encode, USERNAME_ENCODE_SET, PASSWORD_ENCODE_SET}; use util::str::DOMString; pub type SendParam = BlobOrStringOrURLSearchParams; @@ -293,7 +294,9 @@ impl XMLHttpRequestMethods for XMLHttpRequest { } // https://xhr.spec.whatwg.org/#the-open()-method - fn Open(&self, method: ByteString, url: USVString) -> ErrorResult { + fn Open_(&self, method: ByteString, url: USVString, async: bool, + username: Option<USVString>, password: Option<USVString>) -> ErrorResult { + self.sync.set(!async); //FIXME(seanmonstar): use a Trie instead? let maybe_method = method.as_str().and_then(|s| { // Note: hyper tests against the uppercase versions @@ -324,10 +327,11 @@ impl XMLHttpRequestMethods for XMLHttpRequest { // Step 6 let base = self.global().r().get_url(); - let parsed_url = match base.join(&url.0) { + let mut parsed_url = match base.join(&url.0) { Ok(parsed) => parsed, Err(_) => return Err(Error::Syntax) // Step 7 }; + // XXXManishearth Do some handling of username/passwords if self.sync.get() { // FIXME: This should only happen if the global environment is a document environment @@ -336,6 +340,21 @@ impl XMLHttpRequestMethods for XMLHttpRequest { return Err(Error::InvalidAccess) } } + + if parsed_url.host().is_some() { + if let Some(scheme_data) = parsed_url.relative_scheme_data_mut() { + if let Some(user_str) = username { + scheme_data.username = utf8_percent_encode(&user_str.0, USERNAME_ENCODE_SET); + + // ensure that the password is mutated when a username is provided + scheme_data.password = match password { + Some(pass_str) => Some(utf8_percent_encode(&pass_str.0, PASSWORD_ENCODE_SET)), + None => None + } + } + } + } + // abort existing requests self.terminate_ongoing_fetch(); @@ -359,10 +378,8 @@ impl XMLHttpRequestMethods for XMLHttpRequest { } // https://xhr.spec.whatwg.org/#the-open()-method - fn Open_(&self, method: ByteString, url: USVString, async: bool, - _username: Option<USVString>, _password: Option<USVString>) -> ErrorResult { - self.sync.set(!async); - self.Open(method, url) + fn Open(&self, method: ByteString, url: USVString) -> ErrorResult { + self.Open_(method, url, true, None, None) } // https://xhr.spec.whatwg.org/#the-setrequestheader()-method |