You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
2.9 KiB
JavaScript
121 lines
2.9 KiB
JavaScript
|
|
var statuses = require('statuses');
|
|
var inherits = require('inherits');
|
|
|
|
function toIdentifier(str) {
|
|
return str.split(' ').map(function (token) {
|
|
return token.slice(0, 1).toUpperCase() + token.slice(1)
|
|
}).join('').replace(/[^ _0-9a-z]/gi, '')
|
|
}
|
|
|
|
exports = module.exports = function httpError() {
|
|
// so much arity going on ~_~
|
|
var err;
|
|
var msg;
|
|
var status = 500;
|
|
var props = {};
|
|
for (var i = 0; i < arguments.length; i++) {
|
|
var arg = arguments[i];
|
|
if (arg instanceof Error) {
|
|
err = arg;
|
|
status = err.status || err.statusCode || status;
|
|
continue;
|
|
}
|
|
switch (typeof arg) {
|
|
case 'string':
|
|
msg = arg;
|
|
break;
|
|
case 'number':
|
|
status = arg;
|
|
break;
|
|
case 'object':
|
|
props = arg;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (typeof status !== 'number' || !statuses[status]) {
|
|
status = 500
|
|
}
|
|
|
|
// constructor
|
|
var HttpError = exports[status]
|
|
|
|
if (!err) {
|
|
// create error
|
|
err = HttpError
|
|
? new HttpError(msg)
|
|
: new Error(msg || statuses[status])
|
|
Error.captureStackTrace(err, httpError)
|
|
}
|
|
|
|
if (!HttpError || !(err instanceof HttpError)) {
|
|
// add properties to generic error
|
|
err.expose = status < 500
|
|
err.status = err.statusCode = status
|
|
}
|
|
|
|
for (var key in props) {
|
|
if (key !== 'status' && key !== 'statusCode') {
|
|
err[key] = props[key]
|
|
}
|
|
}
|
|
|
|
return err;
|
|
};
|
|
|
|
// create generic error objects
|
|
var codes = statuses.codes.filter(function (num) {
|
|
return num >= 400;
|
|
});
|
|
|
|
codes.forEach(function (code) {
|
|
var name = toIdentifier(statuses[code])
|
|
var className = name.match(/Error$/) ? name : name + 'Error'
|
|
|
|
if (code >= 500) {
|
|
var ServerError = function ServerError(msg) {
|
|
var self = new Error(msg != null ? msg : statuses[code])
|
|
Error.captureStackTrace(self, ServerError)
|
|
self.__proto__ = ServerError.prototype
|
|
Object.defineProperty(self, 'name', {
|
|
enumerable: false,
|
|
configurable: true,
|
|
value: className,
|
|
writable: true
|
|
})
|
|
return self
|
|
}
|
|
inherits(ServerError, Error);
|
|
ServerError.prototype.status =
|
|
ServerError.prototype.statusCode = code;
|
|
ServerError.prototype.expose = false;
|
|
exports[code] =
|
|
exports[name] = ServerError
|
|
return;
|
|
}
|
|
|
|
var ClientError = function ClientError(msg) {
|
|
var self = new Error(msg != null ? msg : statuses[code])
|
|
Error.captureStackTrace(self, ClientError)
|
|
self.__proto__ = ClientError.prototype
|
|
Object.defineProperty(self, 'name', {
|
|
enumerable: false,
|
|
configurable: true,
|
|
value: className,
|
|
writable: true
|
|
})
|
|
return self
|
|
}
|
|
inherits(ClientError, Error);
|
|
ClientError.prototype.status =
|
|
ClientError.prototype.statusCode = code;
|
|
ClientError.prototype.expose = true;
|
|
exports[code] =
|
|
exports[name] = ClientError
|
|
return;
|
|
});
|
|
|
|
// backwards-compatibility
|
|
exports["I'mateapot"] = exports.ImATeapot
|