From 17631ffcb81c348b89febfa56fbf515f39752058 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sun, 29 Jun 2014 12:34:16 +0530 Subject: [PATCH 1/3] Filter response headers --- src/components/script/dom/xmlhttprequest.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/script/dom/xmlhttprequest.rs b/src/components/script/dom/xmlhttprequest.rs index b0f80ceabf1..8b0dc2184eb 100644 --- a/src/components/script/dom/xmlhttprequest.rs +++ b/src/components/script/dom/xmlhttprequest.rs @@ -553,7 +553,7 @@ impl<'a> XMLHttpRequestMethods<'a> for JSRef<'a, XMLHttpRequest> { self.status_text.deref().borrow().clone() } fn GetResponseHeader(&self, name: ByteString) -> Option { - self.response_headers.deref().borrow().iter().find(|h| { + self.filter_response_headers().iter().find(|h| { name.eq_ignore_case(&FromStr::from_str(h.header_name().as_slice()).unwrap()) }).map(|h| { FromStr::from_str(h.header_value().as_slice()).unwrap() @@ -561,7 +561,7 @@ impl<'a> XMLHttpRequestMethods<'a> for JSRef<'a, XMLHttpRequest> { } fn GetAllResponseHeaders(&self) -> ByteString { let mut writer = MemWriter::new(); - self.response_headers.deref().borrow().write_all(&mut writer).ok().expect("Writing response headers failed"); + self.filter_response_headers().write_all(&mut writer).ok().expect("Writing response headers failed"); let mut vec = writer.unwrap(); // rust-http appends an extra "\r\n" when using write_all @@ -669,6 +669,7 @@ trait PrivateXMLHttpRequestHelpers { fn text_response(&self) -> DOMString; fn set_timeout(&self, timeout:u32); fn cancel_timeout(&self); + fn filter_response_headers(&self) -> ResponseHeaderCollection; } impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> { @@ -904,4 +905,16 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> { // the result should be fine. XXXManishearth have a closer look at this later encoding.decode(self.response.deref().borrow().as_slice(), DecodeReplace).unwrap().to_string() } + fn filter_response_headers(&self) -> ResponseHeaderCollection { + // http://fetch.spec.whatwg.org/#concept-response-header-list + let mut headers = ResponseHeaderCollection::new(); + for header in self.response_headers.deref().borrow().iter() { + match header.header_name().as_slice().to_ascii_lower().as_slice() { + "set-cookie" | "set-cookie2" => {}, + // XXXManishearth additional CORS filtering goes here + _ => headers.insert(header) + }; + } + headers + } } From 51f2dbd64df9f49a75beb5e6a4627d80303b1ed1 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sun, 29 Jun 2014 14:37:23 +0530 Subject: [PATCH 2/3] Fix wpt failure on responseType setter --- src/components/script/dom/xmlhttprequest.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/components/script/dom/xmlhttprequest.rs b/src/components/script/dom/xmlhttprequest.rs index 8b0dc2184eb..86112f045b5 100644 --- a/src/components/script/dom/xmlhttprequest.rs +++ b/src/components/script/dom/xmlhttprequest.rs @@ -577,13 +577,11 @@ impl<'a> XMLHttpRequestMethods<'a> for JSRef<'a, XMLHttpRequest> { self.response_type.deref().get() } fn SetResponseType(&self, response_type: XMLHttpRequestResponseType) -> ErrorResult { - if self.sync.deref().get() { - // FIXME: When Workers are implemented, there should be - // an additional check that this is a document environment - return Err(InvalidState); - } + // FIXME: When Workers are implemented, there should be + // an additional check that this is a document environment match self.ready_state.deref().get() { Loading | XHRDone => Err(InvalidState), + _ if self.sync.deref().get() => Err(InvalidAccess), _ => { self.response_type.deref().set(response_type); Ok(()) From 47d80212313f5d0839797bac621bd0cb5e75ae64 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Tue, 1 Jul 2014 23:06:00 +0530 Subject: [PATCH 3/3] Update test expectations for #2731 --- .../getallresponseheaders-cookies.htm.ini | 5 ----- ...getresponseheader-cookies-and-more.htm.ini | 5 ----- .../XMLHttpRequest/responsetype.html.ini | 20 ------------------- 3 files changed, 30 deletions(-) delete mode 100644 src/test/wpt/metadata/XMLHttpRequest/getallresponseheaders-cookies.htm.ini delete mode 100644 src/test/wpt/metadata/XMLHttpRequest/getresponseheader-cookies-and-more.htm.ini delete mode 100644 src/test/wpt/metadata/XMLHttpRequest/responsetype.html.ini diff --git a/src/test/wpt/metadata/XMLHttpRequest/getallresponseheaders-cookies.htm.ini b/src/test/wpt/metadata/XMLHttpRequest/getallresponseheaders-cookies.htm.ini deleted file mode 100644 index a6b1b76a291..00000000000 --- a/src/test/wpt/metadata/XMLHttpRequest/getallresponseheaders-cookies.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[getallresponseheaders-cookies.htm] - type: testharness - [XMLHttpRequest: getAllResponseHeaders() excludes cookies] - expected: FAIL - diff --git a/src/test/wpt/metadata/XMLHttpRequest/getresponseheader-cookies-and-more.htm.ini b/src/test/wpt/metadata/XMLHttpRequest/getresponseheader-cookies-and-more.htm.ini deleted file mode 100644 index ac060491c36..00000000000 --- a/src/test/wpt/metadata/XMLHttpRequest/getresponseheader-cookies-and-more.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[getresponseheader-cookies-and-more.htm] - type: testharness - [XMLHttpRequest: getResponseHeader() custom/non-existent headers and cookies] - expected: FAIL - diff --git a/src/test/wpt/metadata/XMLHttpRequest/responsetype.html.ini b/src/test/wpt/metadata/XMLHttpRequest/responsetype.html.ini deleted file mode 100644 index 02a2726bc0d..00000000000 --- a/src/test/wpt/metadata/XMLHttpRequest/responsetype.html.ini +++ /dev/null @@ -1,20 +0,0 @@ -[responsetype.html] - type: testharness - [Set responseType to "" when readyState is OPENED and the sync flag is set.] - expected: FAIL - - [Set responseType to "json" when readyState is OPENED and the sync flag is set.] - expected: FAIL - - [Set responseType to "document" when readyState is OPENED and the sync flag is set.] - expected: FAIL - - [Set responseType to "arraybuffer" when readyState is OPENED and the sync flag is set.] - expected: FAIL - - [Set responseType to "blob" when readyState is OPENED and the sync flag is set.] - expected: FAIL - - [Set responseType to "text" when readyState is OPENED and the sync flag is set.] - expected: FAIL -