tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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");