From 8aec5c9c2b8a20df1328e068f225aa9d8ea9786b Mon Sep 17 00:00:00 2001 From: Adriano Cola Date: Fri, 20 Apr 2018 09:08:57 -0300 Subject: [PATCH 1/2] Added test to check if browser session expires after several session changes --- test/contextstore.test.js | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/test/contextstore.test.js b/test/contextstore.test.js index 0905fae..a190045 100644 --- a/test/contextstore.test.js +++ b/test/contextstore.test.js @@ -384,6 +384,49 @@ describe('Koa Session External Context Store', () => { .expect('hi', done); }); }); + it('should not expire the session after multiple session changes', done => { + const app = App({ maxAge: 'session' }); + + app.use(async function(ctx) { + ctx.session.count = (ctx.session.count || 0) + 1; + ctx.body = `hi ${ctx.session.count}`; + }); + const server = app.listen(); + + request(server) + .get('/') + .expect('Set-Cookie', /koa:sess/) + .expect('hi 1') + .end((err, res) => { + if (err) return done(err); + let cookie = res.headers['set-cookie'].join(';'); + cookie.should.not.containEql('expires='); + + request(server) + .get('/') + .set('cookie', cookie) + .expect('Set-Cookie', /koa:sess/) + .expect('hi 2') + .end((err, res) => { + if (err) return done(err); + cookie = res.headers['set-cookie'].join(';'); + cookie.should.not.containEql('expires='); + + request(server) + .get('/') + .set('cookie', cookie) + .expect('Set-Cookie', /koa:sess/) + .expect('hi 3') + .end((err, res) => { + if (err) return done(err); + cookie = res.headers['set-cookie'].join(';'); + cookie.should.not.containEql('expires='); + + done(); + }); + }); + }); + }); it('should use the default maxAge when improper string given', done => { const app = App({ maxAge: 'not the right string' }); From 2cd37a450c49fd194c85641445f513d50d8e447d Mon Sep 17 00:00:00 2001 From: Adriano Cola Date: Fri, 20 Apr 2018 09:37:29 -0300 Subject: [PATCH 2/2] Fixed a bug that reset the cookie expire date to the default when using browser sessions. --- lib/context.js | 1 + lib/session.js | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/context.js b/lib/context.js index df162ee..ac80990 100644 --- a/lib/context.js +++ b/lib/context.js @@ -291,6 +291,7 @@ class ContextSession { // do not set _expire in json if maxAge is set to 'session' // also delete maxAge from options opts.maxAge = undefined; + json._session = true; } else { // set expire for check json._expire = maxAge + Date.now(); diff --git a/lib/session.js b/lib/session.js index b585f2a..61d1320 100644 --- a/lib/session.js +++ b/lib/session.js @@ -20,6 +20,7 @@ class Session { for (const k in obj) { // restore maxAge from store if (k === '_maxAge') this._ctx.sessionOptions.maxAge = obj._maxAge; + else if (k === '_session') this._ctx.sessionOptions.maxAge = 'session'; else this[k] = obj[k]; } }