aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/headers.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-08-24 15:35:09 -0500
committerGitHub <noreply@github.com>2016-08-24 15:35:09 -0500
commit5b46a591946e4fc72461481ab361970f49d5af6b (patch)
treea605bc1821bee76a4eeb9e40941d6d02018545de /components/script/dom/headers.rs
parent1370fa5e3b38f3000c0b1439177cc7b7b81d380e (diff)
parente3624edbf6329d63ed2f3716250ab4e8fc254f63 (diff)
downloadservo-5b46a591946e4fc72461481ab361970f49d5af6b.tar.gz
servo-5b46a591946e4fc72461481ab361970f49d5af6b.zip
Auto merge of #12998 - jeenalee:iterable-headers, r=jdm
Implement iterable for headers <!-- Please describe your changes on the following line: --> These patches make Headers iterable based on #12819. The expected wpt results are updated as well. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [ ] These changes fix #__ (github issue number if applicable). <!-- Either: --> - [x] There are tests for these changes OR - [ ] These changes do not require tests because web platform tests for Headers already exist. Expected test results are updated with this PR. <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/12998) <!-- Reviewable:end -->
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 {