UNPKG

5.4 kBJavaScriptView Raw
1'use strict';
2
3var _regenerator = require('babel-runtime/regenerator');
4
5var _regenerator2 = _interopRequireDefault(_regenerator);
6
7function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
9function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
10
11/**
12 * CORS middleware for koa2
13 *
14 * @param {Object} [options]
15 * - {String|Function(ctx)} origin `Access-Control-Allow-Origin`, default is request Origin header
16 * - {Array} exposeHeaders `Access-Control-Expose-Headers`
17 * - {String|Number} maxAge `Access-Control-Max-Age` in seconds
18 * - {Boolean} credentials `Access-Control-Allow-Credentials`
19 * - {Array} allowMethods `Access-Control-Allow-Methods`, default is ['GET', 'PUT', 'POST', 'DELETE', 'HEAD', 'OPTIONS']
20 * - {Array} allowHeaders `Access-Control-Allow-Headers`
21 * @return {Function}
22 * @api public
23 */
24module.exports = function crossOrigin() {
25 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26
27 var defaultOptions = {
28 allowMethods: ['GET', 'PUT', 'POST', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']
29 };
30
31 // set defaultOptions to options
32 for (var key in defaultOptions) {
33 if (!Object.prototype.hasOwnProperty.call(options, key)) {
34 options[key] = defaultOptions[key];
35 }
36 }
37
38 return function () {
39 var _ref = _asyncToGenerator(_regenerator2.default.mark(function _callee(ctx, next) {
40 var origin;
41 return _regenerator2.default.wrap(function _callee$(_context) {
42 while (1) {
43 switch (_context.prev = _context.next) {
44 case 0:
45 origin = void 0;
46
47 if (typeof options.origin === 'function') {
48 origin = options.origin(ctx);
49 } else {
50 origin = options.origin || ctx.get('Origin') || '*';
51 }
52
53 if (origin) {
54 _context.next = 6;
55 break;
56 }
57
58 _context.next = 5;
59 return next();
60
61 case 5:
62 return _context.abrupt('return', _context.sent);
63
64 case 6:
65
66 // Access-Control-Allow-Origin
67 ctx.set('Access-Control-Allow-Origin', origin);
68
69 if (!(ctx.method === 'OPTIONS')) {
70 _context.next = 19;
71 break;
72 }
73
74 if (ctx.get('Access-Control-Request-Method')) {
75 _context.next = 12;
76 break;
77 }
78
79 _context.next = 11;
80 return next();
81
82 case 11:
83 return _context.abrupt('return', _context.sent);
84
85 case 12:
86
87 // Access-Control-Max-Age
88 if (options.maxAge) {
89 ctx.set('Access-Control-Max-Age', String(options.maxAge));
90 }
91
92 // Access-Control-Allow-Credentials
93 if (options.credentials === true) {
94 // When used as part of a response to a preflight request,
95 // this indicates whether or not the actual request can be made using credentials.
96 ctx.set('Access-Control-Allow-Credentials', 'true');
97 }
98
99 // Access-Control-Allow-Methods
100 if (options.allowMethods) {
101 ctx.set('Access-Control-Allow-Methods', options.allowMethods.join(','));
102 }
103
104 // Access-Control-Allow-Headers
105 if (options.allowHeaders) {
106 ctx.set('Access-Control-Allow-Headers', options.allowHeaders.join(','));
107 } else {
108 ctx.set('Access-Control-Allow-Headers', ctx.get('Access-Control-Request-Headers'));
109 }
110
111 ctx.status = 204; // No Content
112 _context.next = 29;
113 break;
114
115 case 19:
116 // Request
117 // Access-Control-Allow-Credentials
118 if (options.credentials === true) {
119 if (origin === '*') {
120 // `credentials` can't be true when the `origin` is set to `*`
121 ctx.remove('Access-Control-Allow-Credentials');
122 } else {
123 ctx.set('Access-Control-Allow-Credentials', 'true');
124 }
125 }
126
127 // Access-Control-Expose-Headers
128 if (options.exposeHeaders) {
129 ctx.set('Access-Control-Expose-Headers', options.exposeHeaders.join(','));
130 }
131
132 _context.prev = 21;
133 _context.next = 24;
134 return next();
135
136 case 24:
137 _context.next = 29;
138 break;
139
140 case 26:
141 _context.prev = 26;
142 _context.t0 = _context['catch'](21);
143 throw _context.t0;
144
145 case 29:
146 case 'end':
147 return _context.stop();
148 }
149 }
150 }, _callee, this, [[21, 26]]);
151 }));
152
153 return function (_x2, _x3) {
154 return _ref.apply(this, arguments);
155 };
156 }();
157};
\No newline at end of file