Implement concept-header-list-sort-and-combine

This commit is contained in:
2shiori17 2023-03-06 23:34:04 +09:00
parent 4ee3f575f6
commit ee1f241231
4 changed files with 24 additions and 12 deletions

1
Cargo.lock generated
View file

@ -5304,6 +5304,7 @@ dependencies = [
"mozangle", "mozangle",
"mozjs", "mozjs",
"msg", "msg",
"net",
"net_traits", "net_traits",
"num-traits", "num-traits",
"parking_lot 0.11.2", "parking_lot 0.11.2",

View file

@ -157,7 +157,7 @@ fn collect_http_quoted_string(position: &mut Peekable<Chars>, extract_value: boo
} }
/// <https://fetch.spec.whatwg.org/#concept-header-list-get> /// <https://fetch.spec.whatwg.org/#concept-header-list-get>
fn get_value_from_header_list(name: &str, headers: &HeaderMap) -> Option<String> { pub fn get_value_from_header_list(name: &str, headers: &HeaderMap) -> Option<String> {
let values = headers let values = headers
.get_all(name) .get_all(name)
.iter() .iter()

View file

@ -76,6 +76,7 @@ mime = "0.3.13"
mime_guess = "2.0.0" mime_guess = "2.0.0"
mitochondria = "1.1.2" mitochondria = "1.1.2"
msg = { path = "../msg" } msg = { path = "../msg" }
net = { path = "../net" }
net_traits = { path = "../net_traits" } net_traits = { path = "../net_traits" }
num-traits = "0.2" num-traits = "0.2"
parking_lot = "0.11" parking_lot = "0.11"

View file

@ -13,6 +13,7 @@ use crate::dom::globalscope::GlobalScope;
use data_url::mime::Mime as DataUrlMime; use data_url::mime::Mime as DataUrlMime;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use http::header::{HeaderMap as HyperHeaders, HeaderName, HeaderValue}; use http::header::{HeaderMap as HyperHeaders, HeaderName, HeaderValue};
use net::fetch::headers::get_value_from_header_list;
use net_traits::request::is_cors_safelisted_request_header; use net_traits::request::is_cors_safelisted_request_header;
use std::cell::Cell; use std::cell::Cell;
use std::str::{self, FromStr}; use std::str::{self, FromStr};
@ -159,7 +160,7 @@ impl HeadersMethods for Headers {
fn GetSetCookie(&self) -> Vec<ByteString> { fn GetSetCookie(&self) -> Vec<ByteString> {
self.header_list self.header_list
.borrow() .borrow()
.get_all("Set-Cookie") .get_all("set-cookie")
.iter() .iter()
.map(|v| ByteString::new(v.as_bytes().to_vec())) .map(|v| ByteString::new(v.as_bytes().to_vec()))
.collect() .collect()
@ -283,16 +284,24 @@ impl Headers {
extract_mime_type(&*self.header_list.borrow()).unwrap_or(vec![]) extract_mime_type(&*self.header_list.borrow()).unwrap_or(vec![])
} }
pub fn sort_header_list(&self) -> Vec<(String, Vec<u8>)> { // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
pub fn sort_and_combine(&self) -> Vec<(String, Vec<u8>)> {
let borrowed_header_list = self.header_list.borrow(); let borrowed_header_list = self.header_list.borrow();
let headers_iter = borrowed_header_list.iter();
let mut header_vec = vec![]; let mut header_vec = vec![];
for (name, value) in headers_iter {
let name = name.as_str().to_owned(); for name in borrowed_header_list.keys() {
let value = value.as_bytes().to_vec(); let name = name.as_str();
let name_value = (name, value); if name == "set-cookie" {
header_vec.push(name_value); for value in borrowed_header_list.get_all(name).iter() {
header_vec.push((name.to_owned(), value.as_bytes().to_vec()));
} }
} else {
if let Some(value) = get_value_from_header_list(name, &borrowed_header_list) {
header_vec.push((name.to_owned(), value.as_bytes().to_vec()));
}
}
}
header_vec.sort(); header_vec.sort();
header_vec header_vec
} }
@ -303,17 +312,18 @@ impl Iterable for Headers {
type Value = ByteString; type Value = ByteString;
fn get_iterable_length(&self) -> u32 { fn get_iterable_length(&self) -> u32 {
self.header_list.borrow().iter().count() as u32 let sorted_header_vec = self.sort_and_combine();
sorted_header_vec.len() as u32
} }
fn get_value_at_index(&self, n: u32) -> ByteString { fn get_value_at_index(&self, n: u32) -> ByteString {
let sorted_header_vec = self.sort_header_list(); let sorted_header_vec = self.sort_and_combine();
let value = sorted_header_vec[n as usize].1.clone(); let value = sorted_header_vec[n as usize].1.clone();
ByteString::new(value) ByteString::new(value)
} }
fn get_key_at_index(&self, n: u32) -> ByteString { fn get_key_at_index(&self, n: u32) -> ByteString {
let sorted_header_vec = self.sort_header_list(); let sorted_header_vec = self.sort_and_combine();
let key = sorted_header_vec[n as usize].0.clone(); let key = sorted_header_vec[n as usize].0.clone();
ByteString::new(key.into_bytes().to_vec()) ByteString::new(key.into_bytes().to_vec())
} }