Skip to content

Commit

Permalink
Fix restoring cookie.originalMaxAge when store returns Date
Browse files Browse the repository at this point in the history
fixes #664
  • Loading branch information
jbialobr authored and dougwilson committed Jun 12, 2019
1 parent 479940a commit 30e23f1
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 10 deletions.
1 change: 1 addition & 0 deletions HISTORY.md
@@ -1,6 +1,7 @@
unreleased
==========

* Fix restoring `cookie.originalMaxAge` when store returns `Date`
* deps: parseurl@~1.3.3

1.16.1 / 2019-04-11
Expand Down
7 changes: 4 additions & 3 deletions session/store.js
Expand Up @@ -90,12 +90,13 @@ Store.prototype.createSession = function(req, sess){
sess.cookie = new Cookie(sess.cookie);

if (typeof expires === 'string') {
// convert expires to a Date object,
// keeping originalMaxAge intact
// convert expires to a Date object
sess.cookie.expires = new Date(expires)
sess.cookie.originalMaxAge = originalMaxAge
}

// keep originalMaxAge intact
sess.cookie.originalMaxAge = originalMaxAge

req.session = new Session(req, sess);
return req.session;
};
33 changes: 26 additions & 7 deletions test/session.js
Expand Up @@ -8,6 +8,7 @@ var http = require('http')
var https = require('https')
var request = require('supertest')
var session = require('../')
var SmartStore = require('./support/smart-store')
var SyncStore = require('./support/sync-store')
var utils = require('./support/utils')

Expand Down Expand Up @@ -1851,21 +1852,39 @@ describe('session()', function(){
})

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

it('should equal original maxAge', function (done) {
request(this.server)
request(server)
.get('/')
.expect(200, '2000', done)
})

it('should equal original maxAge for all requests', function (done) {
var server = this.server
var server = createServer({ cookie: { maxAge: 2000 } }, function (req, res) {
res.end(JSON.stringify(req.session.cookie.originalMaxAge))
})

request(server)
.get('/')
.expect(200, '2000', function (err, res) {
if (err) return done(err)
setTimeout(function () {
request(server)
.get('/')
.set('Cookie', cookie(res))
.expect(200, '2000', done)
}, 100)
})
})

it('should equal original maxAge for all requests', function (done) {
var store = new SmartStore()
var server = createServer({ cookie: { maxAge: 2000 }, store: store }, function (req, res) {
res.end(JSON.stringify(req.session.cookie.originalMaxAge))
})

request(server)
.get('/')
Expand Down
54 changes: 54 additions & 0 deletions test/support/smart-store.js
@@ -0,0 +1,54 @@
'use strict'

var session = require('../../')
var util = require('util')

/* istanbul ignore next */
var defer = typeof setImmediate === 'function'
? setImmediate
: function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }

module.exports = SmartStore

function SmartStore () {
session.Store.call(this)
this.sessions = Object.create(null)
}

util.inherits(SmartStore, session.Store)

SmartStore.prototype.destroy = function destroy (sid, callback) {
delete this.sessions[sid]
defer(callback, null)
}

SmartStore.prototype.get = function get (sid, callback) {
var sess = this.sessions[sid]

if (!sess) {
return
}

// parse
sess = JSON.parse(sess)

if (sess.cookie) {
// expand expires into Date object
sess.cookie.expires = typeof sess.cookie.expires === 'string'
? new Date(sess.cookie.expires)
: sess.cookie.expires

// destroy expired session
if (sess.cookie.expires && sess.cookie.expires <= Date.now()) {
delete this.sessions[sid]
sess = null
}
}

defer(callback, null, sess)
}

SmartStore.prototype.set = function set (sid, sess, callback) {
this.sessions[sid] = JSON.stringify(sess)
defer(callback, null)
}

0 comments on commit 30e23f1

Please sign in to comment.