forked from rjz/supertest-session
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
94 lines (76 loc) · 2.28 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
var cookie = require('cookie'),
methods = require('methods'),
request = require('supertest-as-promised');
// A/V pairs defined for Set-Cookie in RFC-6265
var reservedAvs = [
'path',
'expires',
'max-age',
'domain',
'secure',
'httponly'
];
function serializeCookie (c) {
return Object.keys(c).reduce(function (pairs, key) {
var isReserved = reservedAvs.indexOf(key.toLowerCase()) === -1;
if (isReserved) {
return pairs.concat(decodeURIComponent(cookie.serialize(key, c[key])));
}
return pairs;
}, []);
}
module.exports = function (config) {
if (!config) config = {};
function Session () {
this.app = config.app;
if (config.envs && (config.envs instanceof Object)) {
Object.keys(config.envs).forEach(function(e) {
process.env[e] = config.envs[e];
});
}
}
Session.prototype._before = function (req) {
if (this.cookies) {
req.cookies = this.cookies.map(serializeCookie).join('; ');
}
if (config.before) config.before.call(this, req);
};
// Extract cookies once request is complete
Session.prototype._after = function (req, res) {
if (config.after) config.after.call(this, req, res);
if (res.headers.hasOwnProperty('set-cookie')) {
this.cookies = res.headers['set-cookie'].map(cookie.parse);
}
};
Session.prototype.destroy = function () {
if (config.destroy) config.destroy.call(this);
this.cookies = null;
};
Session.prototype.request = function (meth, route) {
var req = request(this.app)[meth](route);
var sess = this;
var _end = req.end.bind(req);
this._before(req);
req.end = function (callback) {
return _end(function (err, res) {
if (err === null) sess._after(req, res);
return callback(err, res);
});
};
return req;
};
methods.forEach(function (m) {
Session.prototype[m] = function () {
var args = [].slice.call(arguments);
return this.request.apply(this, [m].concat(args));
};
});
// Back-compatibility only; will be removed in future version bump.
Session.prototype.del = Session.prototype.delete;
if (config.helpers instanceof Object) {
Object.keys(config.helpers).forEach(function (key) {
Session.prototype[key] = config.helpers[key];
});
}
return Session;
};