mirror of
https://github.com/socketio/socket.io.git
synced 2026-04-30 03:00:39 -04:00
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
137 lines
3.5 KiB
JavaScript
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",
|
|
});
|
|
});
|
|
});
|