tor-browser

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

connect.https.any.js (6234B)


      1 // META: global=window,worker
      2 // META: script=/common/get-host-info.sub.js
      3 // META: script=resources/webtransport-test-helpers.sub.js
      4 
      5 promise_test(async t => {
      6  const wt = new WebTransport(webtransport_url('custom-response.py?:status=200'));
      7  await wt.ready;
      8 }, 'WebTransport session is established with status code 200');
      9 
     10 promise_test(async t => {
     11  const wt = new WebTransport(webtransport_url('custom-response.py?:status=204'));
     12  await wt.ready;
     13 }, 'WebTransport session is established with status code 204');
     14 
     15 promise_test(async t => {
     16  const wt = new WebTransport(webtransport_url('custom-response.py?:status=301'));
     17  // Sadly we cannot use promise_rejects_dom as the error constructor is
     18  // WebTransportError rather than DOMException. Ditto below.
     19  // We get a possible error, and then make sure wt.closed is rejected with it.
     20  const e = await wt.ready.catch(e => e);
     21  await promise_rejects_exactly(t, e, wt.closed, 'closed promise should be rejected');
     22  await promise_rejects_exactly(t, e, wt.ready, 'ready promise shoud be rejected');
     23  assert_true(e instanceof WebTransportError);
     24  assert_equals(e.source, 'session', 'source');
     25  assert_equals(e.streamErrorCode, null, 'streamErrorCode');
     26 }, 'WebTransport session establishment fails with status code 301');
     27 
     28 promise_test(async t => {
     29  const  wt = new WebTransport(webtransport_url('custom-response.py?:status=401'));
     30  const e = await wt.ready.catch(e => e);
     31  await promise_rejects_exactly(t, e, wt.closed, 'closed promise should be rejected');
     32  await promise_rejects_exactly(t, e, wt.ready, 'ready promise shoud be rejected');
     33  assert_true(e instanceof WebTransportError);
     34  assert_equals(e.source, 'session', 'source');
     35  assert_equals(e.streamErrorCode, null, 'streamErrorCode');
     36 }, 'WebTransport session establishment with status code 401');
     37 
     38 promise_test(async t => {
     39  const wt = new WebTransport(webtransport_url('custom-response.py?:status=404'));
     40  const e = await wt.ready.catch(e => e);
     41  await promise_rejects_exactly(t, e, wt.closed, 'closed promise should be rejected');
     42  await promise_rejects_exactly(t, e, wt.ready, 'ready promise shoud be rejected');
     43  assert_true(e instanceof WebTransportError);
     44  assert_equals(e.source, 'session', 'source');
     45  assert_equals(e.streamErrorCode, null, 'streamErrorCode');
     46 }, 'WebTransport session establishment fails with status code 404');
     47 
     48 promise_test(async t => {
     49  // Create WebTransport session.
     50  const wt = new WebTransport(webtransport_url('echo-request-headers.py'));
     51  await wt.ready;
     52 
     53  // Read incoming unidirectional stream for echoed request headers.
     54  const streams = await wt.incomingUnidirectionalStreams;
     55 
     56  const stream_reader = streams.getReader();
     57  const { value: recv_stream } = await stream_reader.read();
     58  stream_reader.releaseLock();
     59 
     60  const request_headers = await read_stream_as_json(recv_stream);
     61 
     62  // Check the standard request headers.
     63  check_and_remove_standard_headers(request_headers);
     64 }, 'Echo back request headers');
     65 
     66 promise_test(async t => {
     67  // Create WebTransport session.
     68  const options = { protocols: ["a", "b", "c"] };
     69  const wt = new WebTransport(webtransport_url('echo-request-headers.py'), options);
     70  await wt.ready;
     71 
     72  // Read incoming unidirectional stream for echoed request headers.
     73  const streams = await wt.incomingUnidirectionalStreams;
     74 
     75  const stream_reader = streams.getReader();
     76  const { value: recv_stream } = await stream_reader.read();
     77  stream_reader.releaseLock();
     78 
     79  const request_headers = await read_stream_as_json(recv_stream);
     80 
     81  // Check the standard request headers.
     82  check_and_remove_standard_headers(request_headers);
     83  assert_equals(request_headers['wt-available-protocols'], '"a", "b", "c"');
     84  assert_equals(wt.protocol, "");
     85 }, 'Validate subprotocol headers sent');
     86 
     87 promise_test(async t => {
     88  const options = { protocols: ["a", "b", "c"] };
     89  const wt = new WebTransport(webtransport_url('custom-response.py?wt-protocol="b"'), options);
     90  await wt.ready;
     91  assert_equals(wt.protocol, "b");
     92 }, 'Validate subprotocol response header received');
     93 
     94 promise_test(async t => {
     95  const options = { protocols: ["a", "b", "c"] };
     96  const wt = new WebTransport(webtransport_url('custom-response.py?wt-protocol=%22b%22%3B%20a%3Dc%3B%20c%3D2'), options);
     97  await wt.ready;
     98  assert_equals(wt.protocol, "b");
     99 }, 'Validate subprotocol response header received with parameters handled correctly');
    100 
    101 promise_test(async t => {
    102  const options = { protocols: ["a", "b", "c"] };
    103  const wt = new WebTransport(webtransport_url('custom-response.py?wt-protocol=%22d%22'), options);
    104  await wt.ready;
    105  assert_equals(wt.protocol, "");
    106 }, 'Validate subprotocol response header with non-offered protocol gets ignored');
    107 
    108 promise_test(async t => {
    109  const options = { protocols: [] };
    110  const wt = new WebTransport(webtransport_url('custom-response.py?wt-protocol=%22d%22'), options);
    111  await wt.ready;
    112  assert_equals(wt.protocol, "");
    113 }, 'Validate subprotocol response header when no protocols were offered gets ignored');
    114 
    115 promise_test(async t => {
    116  const options = { protocols: ["a", "b", "c"] };
    117  const wt = new WebTransport(webtransport_url('custom-response.py?wt-protocol=b'), options);
    118  await wt.ready;
    119  assert_equals(wt.protocol, "");
    120 }, 'Validate malformed subprotocol response header gets ignored');
    121 
    122 promise_test(async t => {
    123  // Create WebTransport session, and attach "Set-Cookie: foo=bar" to the response of
    124  // the handshake.
    125  const encodedSetCookie = encodeURIComponent('foo=bar');
    126  let wt = new WebTransport(webtransport_url('custom-response.py?set-cookie=' + encodedSetCookie));
    127  await wt.ready;
    128 
    129  wt = new WebTransport(webtransport_url('echo-request-headers.py'));
    130  await wt.ready;
    131 
    132  // Read incoming unidirectional stream for echoed request headers.
    133  const streams = await wt.incomingUnidirectionalStreams;
    134 
    135  const stream_reader = streams.getReader();
    136  const { value: recv_stream } = await stream_reader.read();
    137  stream_reader.releaseLock();
    138 
    139  const request_headers = await read_stream_as_json(recv_stream);
    140 
    141  // Check cookie header is not echoed back.
    142  check_and_remove_standard_headers(request_headers);
    143  assert_equals(request_headers['cookie'], undefined);
    144 }, 'Cookie header is not echoed back');