-
Notifications
You must be signed in to change notification settings - Fork 579
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add Headers.prototype.getSetCookie #1915
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
224 changes: 224 additions & 0 deletions
224
test/wpt/tests/fetch/api/headers/header-setcookie.any.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,224 @@ | ||
// META: title=Headers set-cookie special cases | ||
// META: global=window,worker | ||
|
||
const headerList = [ | ||
["set-cookie", "foo=bar"], | ||
["Set-Cookie", "fizz=buzz; domain=example.com"], | ||
]; | ||
|
||
const setCookie2HeaderList = [ | ||
["set-cookie2", "foo2=bar2"], | ||
["Set-Cookie2", "fizz2=buzz2; domain=example2.com"], | ||
]; | ||
|
||
function assert_nested_array_equals(actual, expected) { | ||
assert_equals(actual.length, expected.length, "Array length is not equal"); | ||
for (let i = 0; i < expected.length; i++) { | ||
assert_array_equals(actual[i], expected[i]); | ||
} | ||
} | ||
|
||
test(function () { | ||
const headers = new Headers(headerList); | ||
assert_equals( | ||
headers.get("set-cookie"), | ||
"foo=bar, fizz=buzz; domain=example.com", | ||
); | ||
}, "Headers.prototype.get combines set-cookie headers in order"); | ||
|
||
test(function () { | ||
const headers = new Headers(headerList); | ||
const list = [...headers]; | ||
assert_nested_array_equals(list, [ | ||
["set-cookie", "foo=bar"], | ||
["set-cookie", "fizz=buzz; domain=example.com"], | ||
]); | ||
}, "Headers iterator does not combine set-cookie headers"); | ||
|
||
test(function () { | ||
const headers = new Headers(setCookie2HeaderList); | ||
const list = [...headers]; | ||
assert_nested_array_equals(list, [ | ||
["set-cookie2", "foo2=bar2, fizz2=buzz2; domain=example2.com"], | ||
]); | ||
}, "Headers iterator does not special case set-cookie2 headers"); | ||
|
||
test(function () { | ||
const headers = new Headers([...headerList, ...setCookie2HeaderList]); | ||
const list = [...headers]; | ||
assert_nested_array_equals(list, [ | ||
["set-cookie", "foo=bar"], | ||
["set-cookie", "fizz=buzz; domain=example.com"], | ||
["set-cookie2", "foo2=bar2, fizz2=buzz2; domain=example2.com"], | ||
]); | ||
}, "Headers iterator does not combine set-cookie & set-cookie2 headers"); | ||
|
||
test(function () { | ||
// Values are in non alphabetic order, and the iterator should yield in the | ||
// headers in the exact order of the input. | ||
const headers = new Headers([ | ||
["set-cookie", "z=z"], | ||
["set-cookie", "a=a"], | ||
["set-cookie", "n=n"], | ||
]); | ||
const list = [...headers]; | ||
assert_nested_array_equals(list, [ | ||
["set-cookie", "z=z"], | ||
["set-cookie", "a=a"], | ||
["set-cookie", "n=n"], | ||
]); | ||
}, "Headers iterator preserves set-cookie ordering"); | ||
|
||
test( | ||
function () { | ||
const headers = new Headers([ | ||
["xylophone-header", "1"], | ||
["best-header", "2"], | ||
["set-cookie", "3"], | ||
["a-cool-header", "4"], | ||
["set-cookie", "5"], | ||
["a-cool-header", "6"], | ||
["best-header", "7"], | ||
]); | ||
const list = [...headers]; | ||
assert_nested_array_equals(list, [ | ||
["a-cool-header", "4, 6"], | ||
["best-header", "2, 7"], | ||
["set-cookie", "3"], | ||
["set-cookie", "5"], | ||
["xylophone-header", "1"], | ||
]); | ||
}, | ||
"Headers iterator preserves per header ordering, but sorts keys alphabetically", | ||
); | ||
|
||
test( | ||
function () { | ||
const headers = new Headers([ | ||
["xylophone-header", "7"], | ||
["best-header", "6"], | ||
["set-cookie", "5"], | ||
["a-cool-header", "4"], | ||
["set-cookie", "3"], | ||
["a-cool-header", "2"], | ||
["best-header", "1"], | ||
]); | ||
const list = [...headers]; | ||
assert_nested_array_equals(list, [ | ||
["a-cool-header", "4, 2"], | ||
["best-header", "6, 1"], | ||
["set-cookie", "5"], | ||
["set-cookie", "3"], | ||
["xylophone-header", "7"], | ||
]); | ||
}, | ||
"Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering)", | ||
); | ||
|
||
test(function () { | ||
const headers = new Headers([["fizz", "buzz"], ["X-Header", "test"]]); | ||
const iterator = headers[Symbol.iterator](); | ||
assert_array_equals(iterator.next().value, ["fizz", "buzz"]); | ||
headers.append("Set-Cookie", "a=b"); | ||
assert_array_equals(iterator.next().value, ["set-cookie", "a=b"]); | ||
headers.append("Accept", "text/html"); | ||
assert_array_equals(iterator.next().value, ["set-cookie", "a=b"]); | ||
assert_array_equals(iterator.next().value, ["x-header", "test"]); | ||
headers.append("set-cookie", "c=d"); | ||
assert_array_equals(iterator.next().value, ["x-header", "test"]); | ||
assert_true(iterator.next().done); | ||
}, "Headers iterator is correctly updated with set-cookie changes"); | ||
|
||
test(function () { | ||
const headers = new Headers(headerList); | ||
assert_true(headers.has("sEt-cOoKiE")); | ||
}, "Headers.prototype.has works for set-cookie"); | ||
|
||
test(function () { | ||
const headers = new Headers(setCookie2HeaderList); | ||
headers.append("set-Cookie", "foo=bar"); | ||
headers.append("sEt-cOoKiE", "fizz=buzz"); | ||
const list = [...headers]; | ||
assert_nested_array_equals(list, [ | ||
["set-cookie", "foo=bar"], | ||
["set-cookie", "fizz=buzz"], | ||
["set-cookie2", "foo2=bar2, fizz2=buzz2; domain=example2.com"], | ||
]); | ||
}, "Headers.prototype.append works for set-cookie"); | ||
|
||
test(function () { | ||
const headers = new Headers(headerList); | ||
headers.set("set-cookie", "foo2=bar2"); | ||
const list = [...headers]; | ||
assert_nested_array_equals(list, [ | ||
["set-cookie", "foo2=bar2"], | ||
]); | ||
}, "Headers.prototype.set works for set-cookie"); | ||
|
||
test(function () { | ||
const headers = new Headers(headerList); | ||
headers.delete("set-Cookie"); | ||
const list = [...headers]; | ||
assert_nested_array_equals(list, []); | ||
}, "Headers.prototype.delete works for set-cookie"); | ||
|
||
test(function () { | ||
const headers = new Headers(); | ||
assert_array_equals(headers.getSetCookie(), []); | ||
}, "Headers.prototype.getSetCookie with no headers present"); | ||
|
||
test(function () { | ||
const headers = new Headers([headerList[0]]); | ||
assert_array_equals(headers.getSetCookie(), ["foo=bar"]); | ||
}, "Headers.prototype.getSetCookie with one header"); | ||
|
||
test(function () { | ||
const headers = new Headers({ "Set-Cookie": "foo=bar" }); | ||
assert_array_equals(headers.getSetCookie(), ["foo=bar"]); | ||
}, "Headers.prototype.getSetCookie with one header created from an object"); | ||
|
||
test(function () { | ||
const headers = new Headers(headerList); | ||
assert_array_equals(headers.getSetCookie(), [ | ||
"foo=bar", | ||
"fizz=buzz; domain=example.com", | ||
]); | ||
}, "Headers.prototype.getSetCookie with multiple headers"); | ||
|
||
test(function () { | ||
const headers = new Headers([["set-cookie", ""]]); | ||
assert_array_equals(headers.getSetCookie(), [""]); | ||
}, "Headers.prototype.getSetCookie with an empty header"); | ||
|
||
test(function () { | ||
const headers = new Headers([["set-cookie", "x"], ["set-cookie", "x"]]); | ||
assert_array_equals(headers.getSetCookie(), ["x", "x"]); | ||
}, "Headers.prototype.getSetCookie with two equal headers"); | ||
|
||
test(function () { | ||
const headers = new Headers([ | ||
["set-cookie2", "x"], | ||
["set-cookie", "y"], | ||
["set-cookie2", "z"], | ||
]); | ||
assert_array_equals(headers.getSetCookie(), ["y"]); | ||
}, "Headers.prototype.getSetCookie ignores set-cookie2 headers"); | ||
|
||
test(function () { | ||
// Values are in non alphabetic order, and the iterator should yield in the | ||
// headers in the exact order of the input. | ||
const headers = new Headers([ | ||
["set-cookie", "z=z"], | ||
["set-cookie", "a=a"], | ||
["set-cookie", "n=n"], | ||
]); | ||
assert_array_equals(headers.getSetCookie(), ["z=z", "a=a", "n=n"]); | ||
}, "Headers.prototype.getSetCookie preserves header ordering"); | ||
|
||
test(function () { | ||
const response = new Response(); | ||
response.headers.append("Set-Cookie", "foo=bar"); | ||
assert_array_equals(response.headers.getSetCookie(), []); | ||
response.headers.append("sEt-cOokIe", "bar=baz"); | ||
assert_array_equals(response.headers.getSetCookie(), []); | ||
}, "Set-Cookie is a forbidden response header"); |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A Map can't be used anymore because there can now be duplicate set-cookie keys. I could probably work around it but it wouldn't be maintainable. So I chose the spec solution instead, which is probably slower, but much easier to fix issues with in the future.