forked from unjs-archive/redirect-ssl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
59 lines (51 loc) · 1.47 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
const isHTTPS = require('is-https');
// Default options
const defaults = {
xForwardedProto: true,
redirectPort: 443,
redirectHost: undefined,
redirectUnknown: true,
statusCode: 307,
redirect: process.env.NODE_ENV === 'production',
exclude: [],
};
const isIgnored = (url, patterns = []) => patterns.some(pattern => url.match(pattern));
// Creates new middleware using provided options
function create(options) {
const {
xForwardedProto,
redirectPort,
redirectHost,
statusCode,
redirectUnknown,
redirect,
exclude,
} = Object.assign({}, defaults, options);
const port = redirectPort === 443 ? '' : (`: ${redirectPort}`);
return function redirectSSL(...args) {
let req;
let res;
let next;
if (args.length === 2) {
([{ req, res }, next] = args);
} else {
[req, res, next] = args;
}
if (redirect && !isIgnored(req.url, exclude)) {
const isHttpsReq = isHTTPS(req, xForwardedProto);
const shouldRedirect = isHttpsReq === false || (redirectUnknown && isHttpsReq === null);
if (shouldRedirect) {
const ـredirectURL = `https://${redirectHost || req.headers.host}${port}${req.url}`;
res.writeHead(statusCode, { Location: ـredirectURL });
return res.end();
}
}
return next();
};
}
// Create a new instance using defaults
const instance = create({});
// Assign create to instance
instance.create = create;
// Export default instance
module.exports = instance;