Closed
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