Skip to content

Upgrading from polling to webtransport will report engine invalid WebTransport handshake. #688

Closed
@zishang520

Description

@zishang520

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

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions