-
Notifications
You must be signed in to change notification settings - Fork 565
Closed
Labels
bugSomething isn't workingSomething isn't working
Description
Describe the bug
Upgrading from polling to webtransport will report engine invalid WebTransport handshake.
To Reproduce
Please fill the following code example:
Engine.IO server version: 6.5.1
Server
import { readFileSync } from "fs";
import { createServer } from "https";
import { Server } from "engine.io";
import { Http3Server } from "@fails-components/webtransport";
// WARNING: the total length of the validity period MUST NOT exceed two weeks (https://w3c.github.io/webtransport/#custom-certificate-requirements)
const cert = readFileSync("/path/to/my/cert.pem");
const key = readFileSync("/path/to/my/key.pem");
const httpsServer = createServer({
key,
cert
});
httpsServer.listen(3000);
const engine = new Server({
transports: ["polling", "websocket", "webtransport"] // WebTransport is not enabled by default
});
engine.attach(httpsServer);
const h3Server = new Http3Server({
port: 3000,
host: "0.0.0.0",
secret: "changeit",
cert,
privKey: key,
});
(async () => {
const stream = await h3Server.sessionStream("/engine.io/");
const sessionReader = stream.getReader();
while (true) {
const { done, value } = await sessionReader.read();
if (done) {
break;
}
engine.onWebTransportSession(value);
}
})();
h3Server.startServer();
Engine.IO client version: 6.5.1
Client
const socket = require("engine.io-client")("wss://localhost:3000", {
transports: ["polling", "webtransport"]
});
function send() {
socket.send('ping');
}
socket.on('open', () => {
send();
});
socket.on('close', () => {
console.log("closed.")
});
socket.on('message', () => {
// setTimeout(send, 100);
});
Expected behavior
engine:socket executing batch send callback +4ms
engine intercepting request for path "/engine.io/" +14ms
engine handling "POST" http request "/engine.io/?EIO=4&transport=polling&t=Obthcpl&sid=tEe1aTFiB5e8y_T8AAAA" +0ms
engine applying middleware n°1 +0ms
engine setting new request for existing client +1ms
engine:polling received "4ping" +14ms
engine:socket received packet message +11ms
4
engine:socket sending packet "message" (pong) +1ms
engine intercepting request for path "/engine.io/" +7ms
engine handling "GET" http request "/engine.io/?EIO=4&transport=polling&t=Obthcpm&sid=tEe1aTFiB5e8y_T8AAAA" +0ms
engine applying middleware n°1 +0ms
engine setting new request for existing client +1ms
engine:polling setting request +7ms
engine:socket flushing buffer to transport +6ms
engine:polling writing "4pong" +0ms
engine:socket executing batch send callback +0ms
handshake data >>>>>> 0{"sid":"tEe1aTFiB5e8y_T8AAAA"}2probe
engine invalid WebTransport handshake +7ms
engine intercepting request for path "/engine.io/" +31ms
engine handling "GET" http request "/engine.io/?EIO=4&transport=polling&t=Obthcq1&sid=tEe1aTFiB5e8y_T8AAAA" +0ms
engine applying middleware n°1 +0ms
engine setting new request for existing client +1ms
engine:polling setting request +39ms
console.log(handshake);
const sid = parseSessionId(handshake);
if (!sid) {
debug("invalid WebTransport handshake");
return session.close();
}
Platform:
- Device: [e.g. Samsung S8]
- OS: [e.g. Android 9.2]
Additional context
Upgrading from polling to webtransport will report engine invalid WebTransport handshake, because the original message reported is: 0{"sid":"xxx"}2probe, parseSessionId cannot correctly parse the sid
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working