3 var Http = require('http');
4 var Hoek = require('hoek');
11 exports.wrap = function (error, statusCode, message) {
13 Hoek.assert(error instanceof Error, 'Cannot wrap non-Error object');
14 return (error.isBoom ? error : internals.initialize(error, statusCode || 500, message));
18 exports.create = function (statusCode, message, data) {
20 return internals.create(statusCode, message, data, exports.create);
23 internals.create = function (statusCode, message, data, ctor) {
25 var error = new Error(message ? message : undefined); // Avoids settings null message
26 Error.captureStackTrace(error, ctor); // Filter the stack to our external API
27 error.data = data || null;
28 internals.initialize(error, statusCode);
32 internals.initialize = function (error, statusCode, message) {
34 var numberCode = parseInt(statusCode, 10);
35 Hoek.assert(!isNaN(numberCode) && numberCode >= 400, 'First argument must be a number (400+):', statusCode);
38 error.isServer = numberCode >= 500;
40 if (!error.hasOwnProperty('data')) {
45 statusCode: numberCode,
50 error.reformat = internals.reformat;
56 message = error.output.payload.error;
60 error.message = (message + (error.message ? ': ' + error.message : ''));
67 internals.reformat = function () {
69 this.output.payload.statusCode = this.output.statusCode;
70 this.output.payload.error = Http.STATUS_CODES[this.output.statusCode] || 'Unknown';
72 if (this.output.statusCode === 500) {
73 this.output.payload.message = 'An internal server error occurred'; // Hide actual error from user
75 else if (this.message) {
76 this.output.payload.message = this.message;
83 exports.badRequest = function (message, data) {
85 return internals.create(400, message, data, exports.badRequest);
89 exports.unauthorized = function (message, scheme, attributes) { // Or function (message, wwwAuthenticate[])
91 var err = internals.create(401, message, undefined, exports.unauthorized);
97 var wwwAuthenticate = '';
101 if (typeof scheme === 'string') {
103 // function (message, scheme, attributes)
105 wwwAuthenticate = scheme;
107 if (attributes || message) {
108 err.output.payload.attributes = {};
112 var names = Object.keys(attributes);
113 for (i = 0, il = names.length; i < il; ++i) {
116 wwwAuthenticate += ',';
119 var value = attributes[name];
120 if (value === null ||
121 value === undefined) { // Value can be zero
125 wwwAuthenticate += ' ' + name + '="' + Hoek.escapeHeaderAttribute(value.toString()) + '"';
126 err.output.payload.attributes[name] = value;
132 wwwAuthenticate += ',';
134 wwwAuthenticate += ' error="' + Hoek.escapeHeaderAttribute(message) + '"';
135 err.output.payload.attributes.error = message;
138 err.isMissing = true;
143 // function (message, wwwAuthenticate[])
145 var wwwArray = scheme;
146 for (i = 0, il = wwwArray.length; i < il; ++i) {
148 wwwAuthenticate += ', ';
151 wwwAuthenticate += wwwArray[i];
155 err.output.headers['WWW-Authenticate'] = wwwAuthenticate;
161 exports.forbidden = function (message, data) {
163 return internals.create(403, message, data, exports.forbidden);
167 exports.notFound = function (message, data) {
169 return internals.create(404, message, data, exports.notFound);
173 exports.methodNotAllowed = function (message, data) {
175 return internals.create(405, message, data, exports.methodNotAllowed);
179 exports.notAcceptable = function (message, data) {
181 return internals.create(406, message, data, exports.notAcceptable);
185 exports.proxyAuthRequired = function (message, data) {
187 return internals.create(407, message, data, exports.proxyAuthRequired);
191 exports.clientTimeout = function (message, data) {
193 return internals.create(408, message, data, exports.clientTimeout);
197 exports.conflict = function (message, data) {
199 return internals.create(409, message, data, exports.conflict);
203 exports.resourceGone = function (message, data) {
205 return internals.create(410, message, data, exports.resourceGone);
209 exports.lengthRequired = function (message, data) {
211 return internals.create(411, message, data, exports.lengthRequired);
215 exports.preconditionFailed = function (message, data) {
217 return internals.create(412, message, data, exports.preconditionFailed);
221 exports.entityTooLarge = function (message, data) {
223 return internals.create(413, message, data, exports.entityTooLarge);
227 exports.uriTooLong = function (message, data) {
229 return internals.create(414, message, data, exports.uriTooLong);
233 exports.unsupportedMediaType = function (message, data) {
235 return internals.create(415, message, data, exports.unsupportedMediaType);
239 exports.rangeNotSatisfiable = function (message, data) {
241 return internals.create(416, message, data, exports.rangeNotSatisfiable);
245 exports.expectationFailed = function (message, data) {
247 return internals.create(417, message, data, exports.expectationFailed);
250 exports.badData = function (message, data) {
252 return internals.create(422, message, data, exports.badData);
256 exports.preconditionRequired = function (message, data) {
258 return internals.create(428, message, data, exports.preconditionRequired);
262 exports.tooManyRequests = function (message, data) {
264 return internals.create(429, message, data, exports.tooManyRequests);
270 exports.internal = function (message, data, statusCode) {
272 return internals.serverError(message, data, statusCode, exports.internal);
275 internals.serverError = function (message, data, statusCode, ctor) {
278 if (data instanceof Error) {
279 error = exports.wrap(data, statusCode, message);
281 error = internals.create(statusCode || 500, message, undefined, ctor);
289 exports.notImplemented = function (message, data) {
291 return internals.serverError(message, data, 501, exports.notImplemented);
295 exports.badGateway = function (message, data) {
297 return internals.serverError(message, data, 502, exports.badGateway);
301 exports.serverTimeout = function (message, data) {
303 return internals.serverError(message, data, 503, exports.serverTimeout);
307 exports.gatewayTimeout = function (message, data) {
309 return internals.serverError(message, data, 504, exports.gatewayTimeout);
313 exports.badImplementation = function (message, data) {
315 var err = internals.serverError(message, data, 500, exports.badImplementation);
316 err.isDeveloperError = true;