Skip to content

Commit ce2de6b

Browse files
dotchevdougwilson
authored andcommitted
Fix resaving already-saved reloaded session at end of request
fixes expressjs#383 closes expressjs#384
1 parent ef30faf commit ce2de6b

3 files changed

Lines changed: 57 additions & 0 deletions

File tree

HISTORY.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
unreleased
2+
==========
3+
4+
* Fix resaving already-saved reloaded session at end of request
5+
16
1.14.2 / 2016-10-30
27
===================
38

index.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,14 +364,30 @@ function session(options) {
364364

365365
// wrap session methods
366366
function wrapmethods(sess) {
367+
var _reload = sess.reload
367368
var _save = sess.save;
368369

370+
function reload(callback) {
371+
debug('reloading %s', this.id)
372+
_reload.call(this, function () {
373+
wrapmethods(req.session)
374+
callback.apply(this, arguments)
375+
})
376+
}
377+
369378
function save() {
370379
debug('saving %s', this.id);
371380
savedHash = hash(this);
372381
_save.apply(this, arguments);
373382
}
374383

384+
Object.defineProperty(sess, 'reload', {
385+
configurable: true,
386+
enumerable: false,
387+
value: reload,
388+
writable: true
389+
})
390+
375391
Object.defineProperty(sess, 'save', {
376392
configurable: true,
377393
enumerable: false,

test/session.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,6 +1714,42 @@ describe('session()', function(){
17141714
})
17151715
})
17161716
})
1717+
1718+
it('should prevent end-of-request save on reloaded session', function (done) {
1719+
var count = 0
1720+
var store = new session.MemoryStore()
1721+
var server = createServer({ store: store }, function (req, res) {
1722+
req.session.hit = true
1723+
req.session.reload(function () {
1724+
req.session.save(function (err) {
1725+
if (err) return res.end(err.message)
1726+
res.end('saved')
1727+
})
1728+
})
1729+
})
1730+
1731+
var _set = store.set
1732+
store.set = function set(sid, sess, callback) {
1733+
count++
1734+
_set.call(store, sid, sess, callback)
1735+
}
1736+
1737+
request(server)
1738+
.get('/')
1739+
.expect(200, 'saved', function (err, res) {
1740+
if (err) return done(err)
1741+
assert.equal(count, 1)
1742+
count = 0
1743+
request(server)
1744+
.get('/')
1745+
.set('Cookie', cookie(res))
1746+
.expect(200, 'saved', function (err) {
1747+
if (err) return done(err)
1748+
assert.equal(count, 1)
1749+
done()
1750+
})
1751+
})
1752+
})
17171753
})
17181754

17191755
describe('.touch()', function () {

0 commit comments

Comments
 (0)