四好公路
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

119 lines
2.4 KiB

'use strict';
/**
* CORS middleware
*
* @param {Object} [options]
* @return {GeneratorFunction}
* @api public
*/
module.exports = function getMiddleware(options) {
options = options || {};
var defaults = {
origin: true,
methods: 'GET,HEAD,PUT,POST,DELETE'
};
// Set defaults
for (var key in defaults) {
if (!options.hasOwnProperty(key)) {
options[key] = defaults[key];
}
}
// Set expose
if (Array.isArray(options.expose)) {
options.expose = options.expose.join(',');
}
// Set maxAge
if (typeof options.maxAge === 'number') {
options.maxAge = options.maxAge.toString();
} else {
options.maxAge = null;
}
// Set methods
if (Array.isArray(options.methods)) {
options.methods = options.methods.join(',');
}
// Set headers
if (Array.isArray(options.headers)) {
options.headers = options.headers.join(',');
}
return function* cors(next) {
/**
* Access Control Allow Origin
*/
var origin;
if (typeof options.origin === 'string') {
origin = options.origin;
} else if (options.origin === true) {
origin = this.get('origin') || '*';
} else if (options.origin === false) {
origin = options.origin;
} else if (typeof options.origin === 'function') {
origin = options.origin(this.request);
}
if (origin === false) return;
this.set('Access-Control-Allow-Origin', origin);
/**
* Access Control Expose Headers
*/
if (options.expose) {
this.set('Access-Control-Expose-Headers', options.expose);
}
/**
* Access Control Max Age
*/
if (options.maxAge) {
this.set('Access-Control-Max-Age', options.maxAge);
}
/**
* Access Control Allow Credentials
*/
if (options.credentials === true) {
this.set('Access-Control-Allow-Credentials', 'true');
}
/**
* Access Control Allow Methods
*/
this.set('Access-Control-Allow-Methods', options.methods);
/**
* Access Control Allow Headers
*/
var headers;
if (options.headers) {
headers = options.headers;
} else {
headers = this.get('access-control-request-headers');
}
if (headers) {
this.set('Access-Control-Allow-Headers', headers);
}
/**
* Returns
*/
if (this.method === 'OPTIONS') {
this.status = 204;
} else {
yield next;
}
};
};