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