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.rs39
1 files changed, 38 insertions, 1 deletions
diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs
index 6fa4e0249c8..7b45956c039 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
@@ -223,6 +225,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 {