Skip to content

Commit 30e23f1

Browse files
jbialobrdougwilson
authored andcommitted
Fix restoring cookie.originalMaxAge when store returns Date
fixes #664
1 parent 479940a commit 30e23f1

File tree

4 files changed

+85
-10
lines changed

4 files changed

+85
-10
lines changed

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 restoring `cookie.originalMaxAge` when store returns `Date`
45
* deps: parseurl@~1.3.3
56

67
1.16.1 / 2019-04-11

session/store.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,13 @@ Store.prototype.createSession = function(req, sess){
9090
sess.cookie = new Cookie(sess.cookie);
9191

9292
if (typeof expires === 'string') {
93-
// convert expires to a Date object,
94-
// keeping originalMaxAge intact
93+
// convert expires to a Date object
9594
sess.cookie.expires = new Date(expires)
96-
sess.cookie.originalMaxAge = originalMaxAge
9795
}
9896

97+
// keep originalMaxAge intact
98+
sess.cookie.originalMaxAge = originalMaxAge
99+
99100
req.session = new Session(req, sess);
100101
return req.session;
101102
};

test/session.js

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var http = require('http')
88
var https = require('https')
99
var request = require('supertest')
1010
var session = require('../')
11+
var SmartStore = require('./support/smart-store')
1112
var SyncStore = require('./support/sync-store')
1213
var utils = require('./support/utils')
1314

@@ -1851,21 +1852,39 @@ describe('session()', function(){
18511852
})
18521853

18531854
describe('.originalMaxAge', function () {
1854-
before(function () {
1855-
this.server = createServer({ cookie: { maxAge: 2000 } }, function (req, res) {
1856-
req.session.hits = (req.session.hits || 0) + 1
1855+
it('should equal original maxAge', function (done) {
1856+
var server = createServer({ cookie: { maxAge: 2000 } }, function (req, res) {
18571857
res.end(JSON.stringify(req.session.cookie.originalMaxAge))
18581858
})
1859-
})
18601859

1861-
it('should equal original maxAge', function (done) {
1862-
request(this.server)
1860+
request(server)
18631861
.get('/')
18641862
.expect(200, '2000', done)
18651863
})
18661864

18671865
it('should equal original maxAge for all requests', function (done) {
1868-
var server = this.server
1866+
var server = createServer({ cookie: { maxAge: 2000 } }, function (req, res) {
1867+
res.end(JSON.stringify(req.session.cookie.originalMaxAge))
1868+
})
1869+
1870+
request(server)
1871+
.get('/')
1872+
.expect(200, '2000', function (err, res) {
1873+
if (err) return done(err)
1874+
setTimeout(function () {
1875+
request(server)
1876+
.get('/')
1877+
.set('Cookie', cookie(res))
1878+
.expect(200, '2000', done)
1879+
}, 100)
1880+
})
1881+
})
1882+
1883+
it('should equal original maxAge for all requests', function (done) {
1884+
var store = new SmartStore()
1885+
var server = createServer({ cookie: { maxAge: 2000 }, store: store }, function (req, res) {
1886+
res.end(JSON.stringify(req.session.cookie.originalMaxAge))
1887+
})
18691888

18701889
request(server)
18711890
.get('/')

test/support/smart-store.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
'use strict'
2+
3+
var session = require('../../')
4+
var util = require('util')
5+
6+
/* istanbul ignore next */
7+
var defer = typeof setImmediate === 'function'
8+
? setImmediate
9+
: function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
10+
11+
module.exports = SmartStore
12+
13+
function SmartStore () {
14+
session.Store.call(this)
15+
this.sessions = Object.create(null)
16+
}
17+
18+
util.inherits(SmartStore, session.Store)
19+
20+
SmartStore.prototype.destroy = function destroy (sid, callback) {
21+
delete this.sessions[sid]
22+
defer(callback, null)
23+
}
24+
25+
SmartStore.prototype.get = function get (sid, callback) {
26+
var sess = this.sessions[sid]
27+
28+
if (!sess) {
29+
return
30+
}
31+
32+
// parse
33+
sess = JSON.parse(sess)
34+
35+
if (sess.cookie) {
36+
// expand expires into Date object
37+
sess.cookie.expires = typeof sess.cookie.expires === 'string'
38+
? new Date(sess.cookie.expires)
39+
: sess.cookie.expires
40+
41+
// destroy expired session
42+
if (sess.cookie.expires && sess.cookie.expires <= Date.now()) {
43+
delete this.sessions[sid]
44+
sess = null
45+
}
46+
}
47+
48+
defer(callback, null, sess)
49+
}
50+
51+
SmartStore.prototype.set = function set (sid, sess, callback) {
52+
this.sessions[sid] = JSON.stringify(sess)
53+
defer(callback, null)
54+
}

0 commit comments

Comments
 (0)