fetch-headers
Version:
186 lines (164 loc) • 5.55 kB
JavaScript
// 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 () {
new Headers({ 'Set-Cookie': 'foo=bar' })
}, 'Create headers with a single set-cookie header in object')
test(function () {
new Headers([headerList[0]])
}, 'Create headers with a single set-cookie header in list')
test(function () {
new Headers(headerList)
}, 'Create headers with multiple set-cookie header in list')
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(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()
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(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')