1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-21 15:04:11 -05:00

fix(ext/websocket): don't throw exception when sending to closed socket

This commit is contained in:
Charlie Bellini 2024-11-19 17:34:26 +01:00
parent 186b52731c
commit be346642e3
3 changed files with 22 additions and 3 deletions

View file

@ -330,10 +330,14 @@ class WebSocket extends EventTarget {
webidl.requiredArguments(arguments.length, 1, prefix); webidl.requiredArguments(arguments.length, 1, prefix);
data = webidl.converters.WebSocketSend(data, prefix, "Argument 1"); data = webidl.converters.WebSocketSend(data, prefix, "Argument 1");
if (this[_readyState] !== OPEN) { if (this[_readyState] === CONNECTING) {
throw new DOMException("'readyState' not OPEN", "InvalidStateError"); throw new DOMException("'readyState' not OPEN", "InvalidStateError");
} }
if (this[_readyState] !== OPEN) {
return;
}
if (this[_sendQueue].length === 0) { if (this[_sendQueue].length === 0) {
// Fast path if the send queue is empty, for example when only synchronous // Fast path if the send queue is empty, for example when only synchronous
// data is being sent. // data is being sent.

View file

@ -806,3 +806,18 @@ Deno.test("Close connection", async () => {
await server.finished; await server.finished;
conn.close(); conn.close();
}); });
Deno.test("send to a closed socket", async () => {
const { promise, resolve } = Promise.withResolvers<void>();
const ws = new WebSocket("ws://localhost:4242");
const blob = new Blob(["foo"]);
ws.onerror = () => fail();
ws.onopen = () => {
ws.close();
ws.send(blob);
};
ws.onclose = () => {
resolve();
};
await promise;
});

View file

@ -11518,10 +11518,10 @@
"006.html?default": true, "006.html?default": true,
"006.html?wpt_flags=h2": false, "006.html?wpt_flags=h2": false,
"006.html?wss": false, "006.html?wss": false,
"007.html?default": false, "007.html?default": true,
"007.html?wpt_flags=h2": false, "007.html?wpt_flags=h2": false,
"007.html?wss": false, "007.html?wss": false,
"008.html?default": false, "008.html?default": true,
"008.html?wss": false, "008.html?wss": false,
"009.html?default": { "009.html?default": {
"ignore": true "ignore": true