diff options
Diffstat (limited to 'components/script/dom/headers.rs')
-rw-r--r-- | components/script/dom/headers.rs | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs index 4ed9a5aebec..b977110955c 100644 --- a/components/script/dom/headers.rs +++ b/components/script/dom/headers.rs @@ -5,9 +5,11 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::HeadersBinding; use dom::bindings::codegen::Bindings::HeadersBinding::HeadersMethods; +use dom::bindings::codegen::Bindings::HeadersBinding::HeadersWrap; use dom::bindings::codegen::UnionTypes::HeadersOrByteStringSequenceSequence; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; +use dom::bindings::iterable::Iterable; use dom::bindings::js::Root; use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::{ByteString, is_token}; @@ -45,7 +47,7 @@ impl Headers { } pub fn new(global: GlobalRef) -> Root<Headers> { - reflect_dom_object(box Headers::new_inherited(), global, HeadersBinding::Wrap) + reflect_dom_object(box Headers::new_inherited(), global, HeadersWrap) } // https://fetch.spec.whatwg.org/#dom-headers @@ -205,7 +207,13 @@ impl Headers { headers_for_request } - pub fn set_guard(&self, new_guard: Guard) { + pub fn for_response(global: GlobalRef) -> Root<Headers> { + let headers_for_response = Headers::new(global); + headers_for_response.guard.set(Guard::Response); + headers_for_response + } + + pub fn set_guard(&self, new_guard: Guard) { self.guard.set(new_guard) } @@ -221,6 +229,41 @@ impl Headers { pub fn extract_mime_type(&self) -> Vec<u8> { self.header_list.borrow().get_raw("content-type").map_or(vec![], |v| v[0].clone()) } + + pub fn sort_header_list(&self) -> Vec<(String, String)> { + let borrowed_header_list = self.header_list.borrow(); + let headers_iter = borrowed_header_list.iter(); + let mut header_vec = vec![]; + for header in headers_iter { + let name = header.name().to_string(); + let value = header.value_string(); + let name_value = (name, value); + header_vec.push(name_value); + } + header_vec.sort(); + header_vec + } +} + +impl Iterable for Headers { + type Key = ByteString; + type Value = ByteString; + + fn get_iterable_length(&self) -> u32 { + self.header_list.borrow().iter().count() as u32 + } + + fn get_value_at_index(&self, n: u32) -> ByteString { + let sorted_header_vec = self.sort_header_list(); + let value = sorted_header_vec[n as usize].1.clone(); + ByteString::new(value.into_bytes().to_vec()) + } + + fn get_key_at_index(&self, n: u32) -> ByteString { + let sorted_header_vec = self.sort_header_list(); + let key = sorted_header_vec[n as usize].0.clone(); + ByteString::new(key.into_bytes().to_vec()) + } } fn is_cors_safelisted_request_content_type(value: &[u8]) -> bool { @@ -307,7 +350,7 @@ pub fn is_forbidden_header_name(name: &str) -> bool { // [3] https://tools.ietf.org/html/rfc7230#section-3.2.6 // [4] https://www.rfc-editor.org/errata_search.php?rfc=7230 fn validate_name_and_value(name: ByteString, value: ByteString) - -> Result<(String, Vec<u8>), Error> { + -> Fallible<(String, Vec<u8>)> { let valid_name = try!(validate_name(name)); if !is_field_content(&value) { return Err(Error::Type("Value is not valid".to_string())); @@ -315,7 +358,7 @@ fn validate_name_and_value(name: ByteString, value: ByteString) Ok((valid_name, value.into())) } -fn validate_name(name: ByteString) -> Result<String, Error> { +fn validate_name(name: ByteString) -> Fallible<String> { if !is_field_name(&name) { return Err(Error::Type("Name is not valid".to_string())); } @@ -405,7 +448,7 @@ fn is_field_vchar(x: u8) -> bool { } // https://tools.ietf.org/html/rfc5234#appendix-B.1 -fn is_vchar(x: u8) -> bool { +pub fn is_vchar(x: u8) -> bool { match x { 0x21...0x7E => true, _ => false, @@ -413,7 +456,7 @@ fn is_vchar(x: u8) -> bool { } // http://tools.ietf.org/html/rfc7230#section-3.2.6 -fn is_obs_text(x: u8) -> bool { +pub fn is_obs_text(x: u8) -> bool { match x { 0x80...0xFF => true, _ => false, |