From b5b6225850174545830e5b8647d1ecb6b370ba6a Mon Sep 17 00:00:00 2001 From: 2shiori17 <98276492+2shiori17@users.noreply.github.com> Date: Sat, 11 Mar 2023 17:32:38 +0900 Subject: [PATCH] Fix concept-headers-append --- components/script/dom/headers.rs | 60 +++++++------------ .../api/headers/header-setcookie.any.js.ini | 40 +------------ 2 files changed, 24 insertions(+), 76 deletions(-) diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs index ef38f475877..f29c059fc05 100644 --- a/components/script/dom/headers.rs +++ b/components/script/dom/headers.rs @@ -64,57 +64,41 @@ impl Headers { impl HeadersMethods for Headers { // https://fetch.spec.whatwg.org/#concept-headers-append fn Append(&self, name: ByteString, value: ByteString) -> ErrorResult { - // Step 1 let value = normalize_value(value); - // Step 2 let (mut valid_name, valid_value) = validate_name_and_value(name, value)?; valid_name = valid_name.to_lowercase(); - // Step 3 + if self.guard.get() == Guard::Immutable { return Err(Error::Type("Guard is immutable".to_string())); } - // Step 4 if self.guard.get() == Guard::Request && is_forbidden_header_name(&valid_name) { return Ok(()); } - // Step 5 - if self.guard.get() == Guard::RequestNoCors && - !is_cors_safelisted_request_header(&valid_name, &valid_value) - { - return Ok(()); - } - // Step 6 if self.guard.get() == Guard::Response && is_forbidden_response_header(&valid_name) { return Ok(()); } - // Step 7 - // FIXME: this is NOT what WHATWG says to do when appending - // another copy of an existing header. HyperHeaders - // might not expose the information we need to do it right. - let mut combined_value: Vec = vec![]; - if let Some(v) = self - .header_list - .borrow() - .get(HeaderName::from_str(&valid_name).unwrap()) - { - combined_value = v.as_bytes().to_vec(); - combined_value.extend(b", "); + + if self.guard.get() == Guard::RequestNoCors { + let tmp_value = if let Some(value) = get_value_from_header_list(&valid_name, &self.header_list.borrow()) { + let mut l = value.as_bytes().to_vec(); + l.extend(b", "); + l.extend(valid_value.clone()); + l + } else { + valid_value.clone() + }; + + if !is_cors_safelisted_request_header(&valid_name, &tmp_value) { + return Ok(()); + } } - combined_value.extend(valid_value.iter().cloned()); - match HeaderValue::from_bytes(&combined_value) { - Ok(value) => { - self.header_list - .borrow_mut() - .insert(HeaderName::from_str(&valid_name).unwrap(), value); - }, - Err(_) => { - // can't add the header, but we don't need to panic the browser over it - warn!( - "Servo thinks \"{:?}\" is a valid HTTP header value but HeaderValue doesn't.", - combined_value - ); - }, - }; + + if self.guard.get() != Guard::RequestNoCors || valid_name != "range" { + self.header_list + .borrow_mut() + .append(HeaderName::from_str(&valid_name).unwrap(), HeaderValue::from_bytes(&valid_value).unwrap()); + } + Ok(()) } diff --git a/tests/wpt/metadata/fetch/api/headers/header-setcookie.any.js.ini b/tests/wpt/metadata/fetch/api/headers/header-setcookie.any.js.ini index bf12e514657..16ef1d0aa0f 100644 --- a/tests/wpt/metadata/fetch/api/headers/header-setcookie.any.js.ini +++ b/tests/wpt/metadata/fetch/api/headers/header-setcookie.any.js.ini @@ -11,31 +11,13 @@ [Headers iterator preserves set-cookie ordering] expected: FAIL - [Headers iterator preserves per header ordering, but sorts keys alphabetically] - expected: FAIL - [Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering)] expected: FAIL - [Headers iterator is correctly updated with set-cookie changes] - expected: FAIL - [Headers.prototype.append works for set-cookie] expected: FAIL - [Headers.prototype.getSetCookie with multiple headers] - expected: FAIL - - [Headers.prototype.getSetCookie with two equal headers] - expected: FAIL - - [Headers.prototype.getSetCookie preserves header ordering] - expected: FAIL - - [Headers iterator is correctly updated with set-cookie changes #2] - expected: FAIL - - [Adding Set-Cookie headers normalizes their value] + [Headers.prototype.get combines set-cookie headers in order] expected: FAIL @@ -49,31 +31,13 @@ [Headers iterator preserves set-cookie ordering] expected: FAIL - [Headers iterator preserves per header ordering, but sorts keys alphabetically] - expected: FAIL - [Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering)] expected: FAIL - [Headers iterator is correctly updated with set-cookie changes] - expected: FAIL - [Headers.prototype.append works for set-cookie] expected: FAIL - [Headers.prototype.getSetCookie with multiple headers] - expected: FAIL - - [Headers.prototype.getSetCookie with two equal headers] - expected: FAIL - - [Headers.prototype.getSetCookie preserves header ordering] - expected: FAIL - - [Headers iterator is correctly updated with set-cookie changes #2] - expected: FAIL - - [Adding Set-Cookie headers normalizes their value] + [Headers.prototype.get combines set-cookie headers in order] expected: FAIL