Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit fcb5763

Browse files
nidhijajumoz-wptsync-bot
authored andcommitted
Bug 1728524 [wpt PR 30282] - Add CONNECT response WPTs for WebTransport, a=testonly
Automatic update from web-platform-tests Add CONNECT response WPTs for WebTransport This CL adds 7 test cases: - establish WebTransport connection with different status codes - echo the CONNECT request headers - setting a cookie in a CONNECT request, and then making sure the "cookie" header is not echoed back The echo-request-headers server handler is also added in this CL, which sends the CONNECT request headers over a unidirectional stream. Bug: 1201569 Change-Id: I30d8092af42dc2505cadbc15bf0573f8815758bd Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3134980 Commit-Queue: Nidhi Jaju <[email protected]> Reviewed-by: Kenichi Ishibashi <[email protected]> Reviewed-by: Yutaka Hirano <[email protected]> Reviewed-by: Adam Rice <[email protected]> Cr-Commit-Position: refs/heads/main@{#918651} -- wpt-commits: 9941150e153b577ae6f6bb837342fdac34814163 wpt-pr: 30282
1 parent a7d49c2 commit fcb5763

File tree

3 files changed

+133
-0
lines changed

3 files changed

+133
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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 connection succeeds 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 connection succeeds with status code 204');
14+
15+
promise_test(async t => {
16+
const wt = new WebTransport(webtransport_url('custom-response.py?:status=301'));
17+
await promise_rejects_js(t, TypeError, wt.ready, 'ready promise shoud be rejected');
18+
await promise_rejects_js(t, TypeError, wt.closed, 'closed promise should be rejected');
19+
}, 'WebTransport connection fails with status code 301');
20+
21+
promise_test(async t => {
22+
const wt = new WebTransport(webtransport_url('custom-response.py?:status=401'));
23+
await promise_rejects_js(t, TypeError, wt.ready, 'ready promise should be rejected');
24+
await promise_rejects_js(t, TypeError, wt.closed, 'closed promise should be rejected');
25+
}, 'WebTransport connection fails with status code 401');
26+
27+
promise_test(async t => {
28+
const wt = new WebTransport(webtransport_url('custom-response.py?:status=404'));
29+
await promise_rejects_js(t, TypeError, wt.ready, 'ready promise should be rejected');
30+
await promise_rejects_js(t, TypeError, wt.closed, 'closed promise should be rejected');
31+
}, 'WebTransport connection fails with status code 404');
32+
33+
promise_test(async t => {
34+
// Create WebTransport session.
35+
const wt = new WebTransport(webtransport_url('echo-request-headers.py'));
36+
await wt.ready;
37+
38+
// Read incoming unidirectional stream for echoed request headers.
39+
const streams = await wt.incomingUnidirectionalStreams;
40+
41+
const stream_reader = streams.getReader();
42+
const { value: recv_stream } = await stream_reader.read();
43+
stream_reader.releaseLock();
44+
45+
const request_headers = await read_stream_as_json(recv_stream);
46+
47+
// Check the standard request headers.
48+
check_and_remove_standard_headers(request_headers);
49+
}, 'Echo back request headers');
50+
51+
promise_test(async t => {
52+
// Create WebTransport session, and attach "Set-Cookie: foo=bar" to the response of
53+
// the handshake.
54+
const encodedSetCookie = encodeURIComponent('foo=bar');
55+
let wt = new WebTransport(webtransport_url('custom-response.py?set-cookie=' + encodedSetCookie));
56+
await wt.ready;
57+
58+
wt = new WebTransport(webtransport_url('echo-request-headers.py'));
59+
await wt.ready;
60+
61+
// Read incoming unidirectional stream for echoed request headers.
62+
const streams = await wt.incomingUnidirectionalStreams;
63+
64+
const stream_reader = streams.getReader();
65+
const { value: recv_stream } = await stream_reader.read();
66+
stream_reader.releaseLock();
67+
68+
const request_headers = await read_stream_as_json(recv_stream);
69+
70+
// Check cookie header is not echoed back.
71+
check_and_remove_standard_headers(request_headers);
72+
assert_equals(request_headers['cookie'], undefined);
73+
}, 'Cookie header is not echoed back');
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import json
2+
3+
4+
def session_established(session):
5+
headers = {}
6+
for name, value in session.request_headers:
7+
headers[name.decode('utf-8')] = value.decode('utf-8')
8+
9+
stream_id = session.create_unidirectional_stream()
10+
data = json.dumps(headers).encode('utf-8')
11+
session.send_stream_data(stream_id, data, end_stream=True)
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// The file including this must also include /common/get-host-info.sub.js to
2+
// pick up the necessary constants.
3+
4+
const HOST = get_host_info().ORIGINAL_HOST;
5+
const PORT = '{{ports[webtransport-h3][0]}}';
6+
const BASE = `https://${HOST}:${PORT}`;
7+
8+
// Create URL for WebTransport session.
9+
function webtransport_url(handler) {
10+
return `${BASE}/webtransport/handlers/${handler}`;
11+
}
12+
13+
// Decode all chunks in a given ReadableStream.
14+
async function read_stream_as_json(stream) {
15+
const decoder = new TextDecoderStream('utf-8');
16+
const decode_stream = stream.readable.pipeThrough(decoder);
17+
const reader = decode_stream.getReader();
18+
19+
let chunks = '';
20+
while (true) {
21+
const {value: chunk, done} = await reader.read();
22+
if (done) {
23+
break;
24+
}
25+
chunks += chunk;
26+
}
27+
reader.releaseLock();
28+
29+
return JSON.parse(chunks);
30+
}
31+
32+
// Check the standard request headers and delete them, leaving any "unique"
33+
// headers to check in the test.
34+
function check_and_remove_standard_headers(headers) {
35+
assert_equals(headers[':scheme'], 'https');
36+
delete headers[':scheme'];
37+
assert_equals(headers[':method'], 'CONNECT');
38+
delete headers[':method'];
39+
assert_equals(headers[':authority'], `${HOST}:${PORT}`);
40+
delete headers[':authority'];
41+
assert_equals(headers[':path'], '/webtransport/handlers/echo-request-headers.py');
42+
delete headers[':path'];
43+
assert_equals(headers[':protocol'], 'webtransport');
44+
delete headers[':protocol'];
45+
assert_equals(headers['origin'], `${get_host_info().ORIGIN}`);
46+
delete headers['origin'];
47+
assert_equals(headers['datagram-flow-id'], '0');
48+
delete headers['datagram-flow-id'];
49+
}

0 commit comments

Comments
 (0)