aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/headers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/headers.rs')
-rw-r--r--components/script/dom/headers.rs55
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,