[engine.io-client] The Node.js cookie jar lets Expires override Max-Age
Les mainteneurs répondent en général sous 2 jours
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 88/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- node.js, typescript
- Domaine
- backend, networking
Piste de recherche
Commencez par parse() dans packages/engine.io-client/lib/globals.node.ts et par le test « should parse a complex set-cookie header » dans packages/engine.io-client/test/node.js. Vérifiez comment Expires et Max-Age sont traités lorsqu’ils sont tous les deux présents, puis mettez à jour le test pour couvrir les deux ordres des attributs d’en-tête et la priorité attendue. Le travail est terminé lorsque Max-Age détermine l’expiration du cookie quel que soit l’ordre des attributs et que les tests d’analyse existants passent.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Describe the bug
With withCredentials: true in Node.js, the cookie jar of engine.io-client applies the Expires and Max-Age attributes in the order they appear in the Set-Cookie header, so whichever comes last wins. According to RFC 6265 (section 5.3, step 3) and MDN, Max-Age takes precedence over Expires when both are present.
Two consequences:
- A cookie like
sid=abc; Max-Age=3600; Path=/; Expires=<date>(which is what Express sends forres.cookie("sid", "abc", { maxAge: 3600000 })) is dropped right away when the client clock is ahead of the server clock by more than the max age, because theExpiresdate is already in the past for the client. WithMax-Agetaking precedence, the cookie would be kept for one hour. - A deletion like
sid=abc; Max-Age=0; Expires=<future date>is ignored, and the cookie keeps being sent.
The existing test "should parse a complex set-cookie header" in packages/engine.io-client/test/node.js also expects the Expires date for a header that carries Max-Age=1000 before Expires.
To Reproduce
Engine.IO server version: 6.6.11
Engine.IO client version: 6.6.8 (also reproduced on main at e94e021)
Server and client
const { createServer } = require("http");
const { attach } = require("engine.io");
const { Socket } = require("engine.io-client");
const setCookie = process.argv[2];
const httpServer = createServer();
const engine = attach(httpServer);
httpServer.prependListener("request", (req) => {
if (req.url.includes("sid=")) {
console.log("cookie header on a later request:", req.headers.cookie);
}
});
engine.on("initial_headers", (headers) => {
headers["set-cookie"] = [setCookie];
});
httpServer.listen(3000, () => {
const socket = new Socket("http://localhost:3000", {
transports: ["polling"],
withCredentials: true,
});
socket.on("open", () => {
setTimeout(() => {
socket.close();
engine.close();
httpServer.close();
}, 200);
});
});
Results:
Set-Cookie sent with the handshake |
cookie header on the next request |
|---|---|
sid=abc; Max-Age=3600; Path=/ |
sid=abc |
sid=abc; Max-Age=3600; Path=/; Expires=<one minute ago> |
none |
sid=abc; Max-Age=0; Path=/; Expires=Fri, 01 Jan 2100 00:00:00 GMT |
sid=abc |
Expected behavior
When a Set-Cookie header has both attributes, the expiry comes from Max-Age, whatever their order: the second cookie is kept for one hour and the third one is removed.
Platform:
- Device: desktop
- OS: Windows, Node.js 24.22.1 (the cookie jar is only used in Node.js)
Additional context
The parsing happens in parse() in packages/engine.io-client/lib/globals.node.ts. I'm happy to send a PR with a test.
AI-assisted: found and reproduced with an AI coding agent; the example above was run locally.
- Langage dominant
- TypeScript
- Étoiles
- 63.2k
- Forks
- 10.2k
- Merge moyen
- 6 j 4 h
- PR mergées (30 j)
- 6
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de socketio/socket.io
-
Raise Engine.IO minimum to 6.6.10 for published security fixesPeut-être pris @harshit-exe-dev l’a pris il y a 28 jours. Ouverte
Difficulté 1/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 2 jours
-
Can't set response headers in Server.handleUpgradePeut-être pris @MsfPablo l’a pris il y a 89 jours. Ouvertequestion
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
socketio/socket.io#5497 · 2 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
WebTransport ignores query parameters in URLPeut-être pris @cyphercodes l’a pris il y a 177 jours. Ouverteneeds major release question
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
socketio/socket.io#5496 · 3 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
cleanupEmptyChildNamespaces releases a child namespace while a socket is in its middleware, and the cleanup unregisters a newer namespace by namePeut-être pris @Jeremiah-D l’a pris il y a 5 jours. Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 54/100
Les mainteneurs répondent en général sous 2 jours
-
Direct Sockets APIOuverteenhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 20/100
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de socketio/socket.io
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
home-assistant/frontend#55841 ·
Les mainteneurs répondent en général sous 1 jour
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Difficulté 1/5 Moins d'une heure Accessibilité débutants 76/100
lingdojo/kana-dojo#33905 · 1 commentaire · 5 réactions ·
Les mainteneurs répondent en général sous 1 jour
-
bug(semester-planning): the edit application dialog cannot save with an empty «Annet fra bedriften»Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
blocklist removal
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
MetaMask/eth-phishing-detect#311215 ·
Les mainteneurs répondent en général sous 1 jour
-
Explore filter: multi-select value list with allowNewOptions stops accepting values and drops earlier onesPeut-être pris @isaac-jaynes-imperva l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/superset#46146 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours