Skip to content

Commit 50cdae2

Browse files
committed
Fix issue where Set-Cookie Expires was not always updated
closes expressjs#276 closes expressjs#277 closes expressjs#296
1 parent 1940ce9 commit 50cdae2

3 files changed

Lines changed: 37 additions & 9 deletions

File tree

HISTORY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
unreleased
22
==========
33

4+
* Fix issue where `Set-Cookie` `Expires` was not always updated
45
* Methods are no longer enumerable on `req.session` object
56
* deps: cookie@0.3.1
67
- Add `sameSite` option

index.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -192,19 +192,21 @@ function session(options){
192192
return;
193193
}
194194

195-
var cookie = req.session.cookie;
195+
if (!shouldSetCookie(req)) {
196+
return;
197+
}
196198

197199
// only send secure cookies via https
198-
if (cookie.secure && !issecure(req, trustProxy)) {
200+
if (req.session.cookie.secure && !issecure(req, trustProxy)) {
199201
debug('not secured');
200202
return;
201203
}
202204

203-
if (!shouldSetCookie(req)) {
204-
return;
205-
}
205+
// touch session
206+
req.session.touch();
206207

207-
setcookie(res, name, req.sessionID, secrets[0], cookie.data);
208+
// set cookie
209+
setcookie(res, name, req.sessionID, secrets[0], req.session.cookie.data);
208210
});
209211

210212
// proxy end() to commit the session
@@ -285,9 +287,6 @@ function session(options){
285287
return _end.call(res, chunk, encoding);
286288
}
287289

288-
// touch session
289-
req.session.touch();
290-
291290
if (shouldSave(req)) {
292291
req.session.save(function onsave(err) {
293292
if (err) {

test/session.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,34 @@ describe('session()', function(){
255255
})
256256
})
257257

258+
it('should update cookie expiration when slow write', function (done) {
259+
var app = express();
260+
app.use(session({ rolling: true, secret: 'keyboard cat', cookie: { maxAge: min }}));
261+
app.use(function (req, res, next) {
262+
req.session.user = 'bob';
263+
res.write('hello, ');
264+
setTimeout(function () {
265+
res.end('world!');
266+
}, 200);
267+
});
268+
269+
request(app)
270+
.get('/')
271+
.expect(shouldSetCookie('connect.sid'))
272+
.expect(200, function (err, res) {
273+
if (err) return done(err);
274+
var originalExpires = expires(res);
275+
setTimeout(function () {
276+
request(app)
277+
.get('/')
278+
.set('Cookie', cookie(res))
279+
.expect(shouldSetCookie('connect.sid'))
280+
.expect(function (res) { assert.notEqual(originalExpires, expires(res)); })
281+
.expect(200, done);
282+
}, (1000 - (Date.now() % 1000) + 200));
283+
});
284+
});
285+
258286
describe('when response ended', function () {
259287
it('should have saved session', function (done) {
260288
var saved = false

0 commit comments

Comments
 (0)