// META: global=window,worker
// META: script=/common/get-host-info.sub.js
// META: script=resources/webtransport-test-helpers.sub.js
promise_test(async t => {
const wt = new WebTransport(webtransport_url('custom-response.py?:status=200'));
await wt.ready;
}, 'WebTransport session is established with status code 200');
promise_test(async t => {
const wt = new WebTransport(webtransport_url('custom-response.py?:status=204'));
await wt.ready;
}, 'WebTransport session is established with status code 204');
promise_test(async t => {
const wt = new WebTransport(webtransport_url('custom-response.py?:status=301'));
// Sadly we cannot use promise_rejects_dom as the error constructor is
// WebTransportError rather than DOMException. Ditto below.
// We get a possible error, and then make sure wt.closed is rejected with it.
const e = await wt.ready.catch(e => e);
await promise_rejects_exactly(t, e, wt.closed, 'closed promise should be rejected');
await promise_rejects_exactly(t, e, wt.ready, 'ready promise shoud be rejected');
assert_true(e instanceof WebTransportError);
assert_equals(e.source, 'session', 'source');
assert_equals(e.streamErrorCode, null, 'streamErrorCode');
}, 'WebTransport session establishment fails with status code 301');
promise_test(async t => {
const wt = new WebTransport(webtransport_url('custom-response.py?:status=401'));
const e = await wt.ready.catch(e => e);
await promise_rejects_exactly(t, e, wt.closed, 'closed promise should be rejected');
await promise_rejects_exactly(t, e, wt.ready, 'ready promise shoud be rejected');
assert_true(e instanceof WebTransportError);
assert_equals(e.source, 'session', 'source');
assert_equals(e.streamErrorCode, null, 'streamErrorCode');
}, 'WebTransport session establishment with status code 401');
promise_test(async t => {
const wt = new WebTransport(webtransport_url('custom-response.py?:status=404'));
const e = await wt.ready.catch(e => e);
await promise_rejects_exactly(t, e, wt.closed, 'closed promise should be rejected');
await promise_rejects_exactly(t, e, wt.ready, 'ready promise shoud be rejected');
assert_true(e instanceof WebTransportError);
assert_equals(e.source, 'session', 'source');
assert_equals(e.streamErrorCode, null, 'streamErrorCode');
}, 'WebTransport session establishment fails with status code 404');
promise_test(async t => {
// Create WebTransport session.
const wt = new WebTransport(webtransport_url('echo-request-headers.py'));
await wt.ready;
// Read incoming unidirectional stream for echoed request headers.
const streams = await wt.incomingUnidirectionalStreams;
const stream_reader = streams.getReader();
const { value: recv_stream } = await stream_reader.read();
stream_reader.releaseLock();
const request_headers = await read_stream_as_json(recv_stream);
// Check the standard request headers.
check_and_remove_standard_headers(request_headers);
}, 'Echo back request headers');
promise_test(async t => {
// Create WebTransport session, and attach "Set-Cookie: foo=bar" to the response of
// the handshake.
const encodedSetCookie = encodeURIComponent('foo=bar');
let wt = new WebTransport(webtransport_url('custom-response.py?set-cookie=' + encodedSetCookie));
await wt.ready;
wt = new WebTransport(webtransport_url('echo-request-headers.py'));
await wt.ready;
// Read incoming unidirectional stream for echoed request headers.
const streams = await wt.incomingUnidirectionalStreams;
const stream_reader = streams.getReader();
const { value: recv_stream } = await stream_reader.read();
stream_reader.releaseLock();
const request_headers = await read_stream_as_json(recv_stream);
// Check cookie header is not echoed back.
check_and_remove_standard_headers(request_headers);
assert_equals(request_headers['cookie'], undefined);
}, 'Cookie header is not echoed back');