Files
socket.io/test/node.js
Damien Arrachequesne 5fc88a62d4 feat: implement cookie management for the Node.js client
When setting the `withCredentials` option to `true`, the Node.js client
will now include the cookies in the HTTP requests, making it easier to
use it with cookie-based sticky sessions.

Related: https://github.com/socketio/socket.io/issues/3812
2023-06-13 17:31:00 +02:00

137 lines
3.5 KiB
JavaScript

const path = require("path");
const { exec } = require("child_process");
const { Socket } = require("../");
const { repeat } = require("./util");
const expect = require("expect.js");
const { parse } = require("../build/cjs/transports/xmlhttprequest.js");
describe("node.js", () => {
describe("autoRef option", () => {
const fixture = (filename) =>
process.execPath + " " + path.join(__dirname, "fixtures", filename);
it("should stop once the timer is triggered", (done) => {
exec(fixture("unref.js"), done);
});
it("should stop once the timer is triggered (polling)", (done) => {
exec(fixture("unref-polling-only.js"), done);
});
it("should stop once the timer is triggered (websocket)", (done) => {
exec(fixture("unref-websocket-only.js"), done);
});
it("should not stop with autoUnref set to false", (done) => {
let isComplete = false;
const process = exec(fixture("no-unref.js"), () => {
if (!isComplete) {
done(new Error("should not happen"));
}
});
setTimeout(() => {
isComplete = true;
process.kill();
done();
}, 1000);
});
});
it("should merge binary packets according to maxPayload value", (done) => {
const socket = new Socket({ transports: ["polling"] });
socket.on("open", () => {
socket.send(Buffer.allocUnsafe(72));
socket.send(Buffer.allocUnsafe(20));
socket.send(repeat("a", 20));
socket.send(Buffer.allocUnsafe(20));
socket.send(Buffer.allocUnsafe(72));
let count = 0;
socket.on("message", () => {
count++;
if (count === 5) {
socket.close();
done();
}
});
});
});
it("should send cookies with withCredentials: true", (done) => {
const socket = new Socket("http://localhost:3000", {
transports: ["polling"],
withCredentials: true,
});
socket.on("open", () => {
socket.send("sendHeaders");
});
socket.on("message", (data) => {
if (data === "hi") {
return;
}
const headers = JSON.parse(data);
expect(headers.cookie).to.eql("1=1; 2=2");
socket.close();
done();
});
});
it("should not send cookies with withCredentials: false", (done) => {
const socket = new Socket("http://localhost:3000", {
transports: ["polling"],
withCredentials: false,
});
socket.on("open", () => {
socket.send("sendHeaders");
});
socket.on("message", (data) => {
if (data === "hi") {
return;
}
const headers = JSON.parse(data);
expect(headers.cookie).to.eql(undefined);
socket.close();
done();
});
});
});
describe("cookie parsing", () => {
it("should parse a simple set-cookie header", () => {
const cookieStr = "foo=bar";
expect(parse(cookieStr)).to.eql({
name: "foo",
value: "bar",
});
});
it("should parse a complex set-cookie header", () => {
const cookieStr =
"foo=bar; Max-Age=1000; Domain=.example.com; Path=/; Expires=Tue, 01 Jul 2025 10:01:11 GMT; HttpOnly; Secure; SameSite=strict";
expect(parse(cookieStr)).to.eql({
name: "foo",
value: "bar",
expires: new Date("Tue Jul 01 2025 06:01:11 GMT-0400 (EDT)"),
});
});
it("should parse a weird but valid cookie", () => {
const cookieStr =
"foo=bar=bar&foo=foo&John=Doe&Doe=John; Domain=.example.com; Path=/; HttpOnly; Secure";
expect(parse(cookieStr)).to.eql({
name: "foo",
value: "bar=bar&foo=foo&John=Doe&Doe=John",
});
});
});