Skip to content

Commit 12ea203

Browse files
committed
doc + test
1 parent 8cb1042 commit 12ea203

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed

Diff for: README.md

+36
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,42 @@ The default value is `'keep'`.
280280
- `'keep'` The session in the store will be kept, but modifications made during
281281
the request are ignored and not saved.
282282

283+
##### getcookie
284+
285+
Allows to specify a custom function to read and parse the cookie.
286+
287+
Warning the function signature is subject to change in the future, this option is unsafe
288+
289+
```js
290+
app.use(session({
291+
getcookie(req) { // full signature is (req, name, secrets)
292+
var cookies = cookie.parse(headers.cookie || headers.authorization || '');
293+
return signature.unsign(cookies[sessionKey] || '', sessionSecret);
294+
},
295+
secret: 'keyboard cat'
296+
}))
297+
```
298+
299+
300+
##### setcookie
301+
302+
Similarly to getookie, it allows to specify a custom function to set cookie.
303+
304+
Warning again, the function signature is subject to change in the future,
305+
and should be used carefully like getcookie
306+
307+
```js
308+
app.use(session({
309+
setcookie(res, name, val, secret, options) {
310+
var signed = signature.sign(val, secret);
311+
var data = cookie.serialize(name, signed, options);
312+
res.setHeader('set-cookie', data);
313+
res.setHeader('authorization', data);
314+
},
315+
secret: 'keyboard cat'
316+
}))
317+
```
318+
283319
### req.session
284320

285321
To store or access session data, simply use the request property `req.session`,

Diff for: test/getcookie.js

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
'use strict';
2+
process.env.NO_DEPRECATION = 'express-session';
3+
4+
var after = require('after')
5+
var assert = require('assert')
6+
var express = require('express')
7+
, request = require('supertest')
8+
, cookieParser = require('cookie-parser')
9+
, session = require('../')
10+
, Cookie = require('../session/cookie')
11+
var fs = require('fs')
12+
var http = require('http')
13+
var https = require('https')
14+
var util = require('util')
15+
var cookie = require('cookie')
16+
var signature = require('cookie-signature')
17+
18+
var min = 60 * 1000;
19+
20+
describe('session getcookie()', function(){
21+
22+
var sessionKey = 'foo';
23+
var sessionSecret = 'bar';
24+
25+
var app = express()
26+
.use(session({
27+
name: sessionKey,
28+
secret: sessionSecret,
29+
getcookie: function(req) {
30+
var cookies = cookie.parse(req.headers.authorization || '');
31+
return signature.unsign(cookies[sessionKey] || '', sessionSecret);
32+
},
33+
setcookie: function(res, name, val, secret, options) {
34+
var signed = signature.sign(val, secret);
35+
var data = cookie.serialize(name, signed, options);
36+
res.setHeader('Access-Control-Expose-Headers', 'Authorization');
37+
res.setHeader('authorization', data);
38+
}
39+
}))
40+
.post('/', function(req, res) {
41+
req.session.user = 'John';
42+
return res.json({ok: 1})
43+
})
44+
.get('/', function(req, res) {
45+
res.json({user: req.session.user});
46+
});
47+
48+
49+
var data;
50+
51+
it('should set a session, and send it in authorization header', function(done){
52+
53+
request(app)
54+
.post('/')
55+
.expect(function (res) {
56+
data = res.headers.authorization;
57+
})
58+
.expect(200, done)
59+
})
60+
61+
it('should get the session using authorization header', function(done){
62+
63+
request(app)
64+
.get('/')
65+
.set('Authorization', data)
66+
.expect(function (res) {
67+
assert.equal(res.body.user, 'John')
68+
})
69+
.expect(200, done)
70+
71+
})
72+
73+
})
74+

Diff for: test/session.js

+2
Original file line numberDiff line numberDiff line change
@@ -2084,6 +2084,8 @@ describe('session()', function(){
20842084
})
20852085
})
20862086

2087+
2088+
20872089
function cookie(res) {
20882090
var setCookie = res.headers['set-cookie'];
20892091
return (setCookie && setCookie[0]) || undefined;

0 commit comments

Comments
 (0)