header-setcookie.any.js (8697B)
1 // META: title=Headers set-cookie special cases 2 // META: global=window,worker 3 4 const headerList = [ 5 ["set-cookie", "foo=bar"], 6 ["Set-Cookie", "fizz=buzz; domain=example.com"], 7 ]; 8 9 const setCookie2HeaderList = [ 10 ["set-cookie2", "foo2=bar2"], 11 ["Set-Cookie2", "fizz2=buzz2; domain=example2.com"], 12 ]; 13 14 function assert_nested_array_equals(actual, expected) { 15 assert_equals(actual.length, expected.length, "Array length is not equal"); 16 for (let i = 0; i < expected.length; i++) { 17 assert_array_equals(actual[i], expected[i]); 18 } 19 } 20 21 test(function () { 22 const headers = new Headers(headerList); 23 assert_equals( 24 headers.get("set-cookie"), 25 "foo=bar, fizz=buzz; domain=example.com", 26 ); 27 }, "Headers.prototype.get combines set-cookie headers in order"); 28 29 test(function () { 30 const headers = new Headers(headerList); 31 const list = [...headers]; 32 assert_nested_array_equals(list, [ 33 ["set-cookie", "foo=bar"], 34 ["set-cookie", "fizz=buzz; domain=example.com"], 35 ]); 36 }, "Headers iterator does not combine set-cookie headers"); 37 38 test(function () { 39 const headers = new Headers(setCookie2HeaderList); 40 const list = [...headers]; 41 assert_nested_array_equals(list, [ 42 ["set-cookie2", "foo2=bar2, fizz2=buzz2; domain=example2.com"], 43 ]); 44 }, "Headers iterator does not special case set-cookie2 headers"); 45 46 test(function () { 47 const headers = new Headers([...headerList, ...setCookie2HeaderList]); 48 const list = [...headers]; 49 assert_nested_array_equals(list, [ 50 ["set-cookie", "foo=bar"], 51 ["set-cookie", "fizz=buzz; domain=example.com"], 52 ["set-cookie2", "foo2=bar2, fizz2=buzz2; domain=example2.com"], 53 ]); 54 }, "Headers iterator does not combine set-cookie & set-cookie2 headers"); 55 56 test(function () { 57 // Values are in non alphabetic order, and the iterator should yield in the 58 // headers in the exact order of the input. 59 const headers = new Headers([ 60 ["set-cookie", "z=z"], 61 ["set-cookie", "a=a"], 62 ["set-cookie", "n=n"], 63 ]); 64 const list = [...headers]; 65 assert_nested_array_equals(list, [ 66 ["set-cookie", "z=z"], 67 ["set-cookie", "a=a"], 68 ["set-cookie", "n=n"], 69 ]); 70 }, "Headers iterator preserves set-cookie ordering"); 71 72 test( 73 function () { 74 const headers = new Headers([ 75 ["xylophone-header", "1"], 76 ["best-header", "2"], 77 ["set-cookie", "3"], 78 ["a-cool-header", "4"], 79 ["set-cookie", "5"], 80 ["a-cool-header", "6"], 81 ["best-header", "7"], 82 ]); 83 const list = [...headers]; 84 assert_nested_array_equals(list, [ 85 ["a-cool-header", "4, 6"], 86 ["best-header", "2, 7"], 87 ["set-cookie", "3"], 88 ["set-cookie", "5"], 89 ["xylophone-header", "1"], 90 ]); 91 }, 92 "Headers iterator preserves per header ordering, but sorts keys alphabetically", 93 ); 94 95 test( 96 function () { 97 const headers = new Headers([ 98 ["xylophone-header", "7"], 99 ["best-header", "6"], 100 ["set-cookie", "5"], 101 ["a-cool-header", "4"], 102 ["set-cookie", "3"], 103 ["a-cool-header", "2"], 104 ["best-header", "1"], 105 ]); 106 const list = [...headers]; 107 assert_nested_array_equals(list, [ 108 ["a-cool-header", "4, 2"], 109 ["best-header", "6, 1"], 110 ["set-cookie", "5"], 111 ["set-cookie", "3"], 112 ["xylophone-header", "7"], 113 ]); 114 }, 115 "Headers iterator preserves per header ordering, but sorts keys alphabetically (and ignores value ordering)", 116 ); 117 118 test(function () { 119 const headers = new Headers([["fizz", "buzz"], ["X-Header", "test"]]); 120 const iterator = headers[Symbol.iterator](); 121 assert_array_equals(iterator.next().value, ["fizz", "buzz"]); 122 headers.append("Set-Cookie", "a=b"); 123 assert_array_equals(iterator.next().value, ["set-cookie", "a=b"]); 124 headers.append("Accept", "text/html"); 125 assert_array_equals(iterator.next().value, ["set-cookie", "a=b"]); 126 assert_array_equals(iterator.next().value, ["x-header", "test"]); 127 headers.append("set-cookie", "c=d"); 128 assert_array_equals(iterator.next().value, ["x-header", "test"]); 129 assert_true(iterator.next().done); 130 }, "Headers iterator is correctly updated with set-cookie changes"); 131 132 test(function () { 133 const headers = new Headers([ 134 ["set-cookie", "a"], 135 ["set-cookie", "b"], 136 ["set-cookie", "c"] 137 ]); 138 const iterator = headers[Symbol.iterator](); 139 assert_array_equals(iterator.next().value, ["set-cookie", "a"]); 140 headers.delete("set-cookie"); 141 headers.append("set-cookie", "d"); 142 headers.append("set-cookie", "e"); 143 headers.append("set-cookie", "f"); 144 assert_array_equals(iterator.next().value, ["set-cookie", "e"]); 145 assert_array_equals(iterator.next().value, ["set-cookie", "f"]); 146 assert_true(iterator.next().done); 147 }, "Headers iterator is correctly updated with set-cookie changes #2"); 148 149 test(function () { 150 const headers = new Headers(headerList); 151 assert_true(headers.has("sEt-cOoKiE")); 152 }, "Headers.prototype.has works for set-cookie"); 153 154 test(function () { 155 const headers = new Headers(setCookie2HeaderList); 156 headers.append("set-Cookie", "foo=bar"); 157 headers.append("sEt-cOoKiE", "fizz=buzz"); 158 const list = [...headers]; 159 assert_nested_array_equals(list, [ 160 ["set-cookie", "foo=bar"], 161 ["set-cookie", "fizz=buzz"], 162 ["set-cookie2", "foo2=bar2, fizz2=buzz2; domain=example2.com"], 163 ]); 164 }, "Headers.prototype.append works for set-cookie"); 165 166 test(function () { 167 const headers = new Headers(headerList); 168 headers.set("set-cookie", "foo2=bar2"); 169 const list = [...headers]; 170 assert_nested_array_equals(list, [ 171 ["set-cookie", "foo2=bar2"], 172 ]); 173 }, "Headers.prototype.set works for set-cookie"); 174 175 test(function () { 176 const headers = new Headers(headerList); 177 headers.delete("set-Cookie"); 178 const list = [...headers]; 179 assert_nested_array_equals(list, []); 180 }, "Headers.prototype.delete works for set-cookie"); 181 182 test(function () { 183 const headers = new Headers(); 184 assert_array_equals(headers.getSetCookie(), []); 185 }, "Headers.prototype.getSetCookie with no headers present"); 186 187 test(function () { 188 const headers = new Headers([headerList[0]]); 189 assert_array_equals(headers.getSetCookie(), ["foo=bar"]); 190 }, "Headers.prototype.getSetCookie with one header"); 191 192 test(function () { 193 const headers = new Headers({ "Set-Cookie": "foo=bar" }); 194 assert_array_equals(headers.getSetCookie(), ["foo=bar"]); 195 }, "Headers.prototype.getSetCookie with one header created from an object"); 196 197 test(function () { 198 const headers = new Headers(headerList); 199 assert_array_equals(headers.getSetCookie(), [ 200 "foo=bar", 201 "fizz=buzz; domain=example.com", 202 ]); 203 }, "Headers.prototype.getSetCookie with multiple headers"); 204 205 test(function () { 206 const headers = new Headers([["set-cookie", ""]]); 207 assert_array_equals(headers.getSetCookie(), [""]); 208 }, "Headers.prototype.getSetCookie with an empty header"); 209 210 test(function () { 211 const headers = new Headers([["set-cookie", "x"], ["set-cookie", "x"]]); 212 assert_array_equals(headers.getSetCookie(), ["x", "x"]); 213 }, "Headers.prototype.getSetCookie with two equal headers"); 214 215 test(function () { 216 const headers = new Headers([ 217 ["set-cookie2", "x"], 218 ["set-cookie", "y"], 219 ["set-cookie2", "z"], 220 ]); 221 assert_array_equals(headers.getSetCookie(), ["y"]); 222 }, "Headers.prototype.getSetCookie ignores set-cookie2 headers"); 223 224 test(function () { 225 // Values are in non alphabetic order, and the iterator should yield in the 226 // headers in the exact order of the input. 227 const headers = new Headers([ 228 ["set-cookie", "z=z"], 229 ["set-cookie", "a=a"], 230 ["set-cookie", "n=n"], 231 ]); 232 assert_array_equals(headers.getSetCookie(), ["z=z", "a=a", "n=n"]); 233 }, "Headers.prototype.getSetCookie preserves header ordering"); 234 235 test(function () { 236 const headers = new Headers({"Set-Cookie": " a=b\n"}); 237 headers.append("set-cookie", "\n\rc=d "); 238 assert_nested_array_equals([...headers], [ 239 ["set-cookie", "a=b"], 240 ["set-cookie", "c=d"] 241 ]); 242 headers.set("set-cookie", "\te=f "); 243 assert_nested_array_equals([...headers], [["set-cookie", "e=f"]]); 244 }, "Adding Set-Cookie headers normalizes their value"); 245 246 test(function () { 247 assert_throws_js(TypeError, () => { 248 new Headers({"set-cookie": "\0"}); 249 }); 250 251 const headers = new Headers(); 252 assert_throws_js(TypeError, () => { 253 headers.append("Set-Cookie", "a\nb"); 254 }); 255 assert_throws_js(TypeError, () => { 256 headers.set("Set-Cookie", "a\rb"); 257 }); 258 }, "Adding invalid Set-Cookie headers throws"); 259 260 test(function () { 261 const response = new Response(); 262 response.headers.append("Set-Cookie", "foo=bar"); 263 assert_array_equals(response.headers.getSetCookie(), []); 264 response.headers.append("sEt-cOokIe", "bar=baz"); 265 assert_array_equals(response.headers.getSetCookie(), []); 266 }, "Set-Cookie is a forbidden response header");