Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81155 views
1
// Load modules
2
3
var Http = require('http');
4
var Hoek = require('hoek');
5
6
7
// Declare internals
8
9
var internals = {};
10
11
12
exports.wrap = function (error, statusCode, message) {
13
14
Hoek.assert(error instanceof Error, 'Cannot wrap non-Error object');
15
return (error.isBoom ? error : internals.initialize(error, statusCode || 500, message));
16
};
17
18
19
exports.create = function (statusCode, message, data) {
20
21
var error = new Error(message ? message : undefined); // Avoids settings null message
22
error.data = data || null;
23
internals.initialize(error, statusCode);
24
return error;
25
};
26
27
28
internals.initialize = function (error, statusCode, message) {
29
30
var numberCode = parseInt(statusCode, 10);
31
Hoek.assert(!isNaN(numberCode) && numberCode >= 400, 'First argument must be a number (400+):', statusCode);
32
33
error.isBoom = true;
34
error.isServer = numberCode >= 500;
35
36
if (!error.hasOwnProperty('data')) {
37
error.data = null;
38
}
39
40
error.output = {
41
statusCode: numberCode,
42
payload: {},
43
headers: {}
44
};
45
46
error.reformat = internals.reformat;
47
error.reformat();
48
49
if (!message &&
50
!error.message) {
51
52
message = error.output.payload.error;
53
}
54
55
if (message) {
56
error.message = (message + (error.message ? ': ' + error.message : ''));
57
}
58
59
return error;
60
};
61
62
63
internals.reformat = function () {
64
65
this.output.payload.statusCode = this.output.statusCode;
66
this.output.payload.error = Http.STATUS_CODES[this.output.statusCode] || 'Unknown';
67
68
if (this.output.statusCode === 500) {
69
this.output.payload.message = 'An internal server error occurred'; // Hide actual error from user
70
}
71
else if (this.message) {
72
this.output.payload.message = this.message;
73
}
74
};
75
76
77
// 4xx Client Errors
78
79
exports.badRequest = function (message, data) {
80
81
return exports.create(400, message, data);
82
};
83
84
85
exports.unauthorized = function (message, scheme, attributes) { // Or function (message, wwwAuthenticate[])
86
87
var err = exports.create(401, message);
88
89
if (!scheme) {
90
return err;
91
}
92
93
var wwwAuthenticate = '';
94
var i = 0;
95
var il = 0;
96
97
if (typeof scheme === 'string') {
98
99
// function (message, scheme, attributes)
100
101
wwwAuthenticate = scheme;
102
if (attributes) {
103
var names = Object.keys(attributes);
104
for (i = 0, il = names.length; i < il; ++i) {
105
if (i) {
106
wwwAuthenticate += ',';
107
}
108
109
var value = attributes[names[i]];
110
if (value === null ||
111
value === undefined) { // Value can be zero
112
113
value = '';
114
}
115
wwwAuthenticate += ' ' + names[i] + '="' + Hoek.escapeHeaderAttribute(value.toString()) + '"';
116
}
117
}
118
119
if (message) {
120
if (attributes) {
121
wwwAuthenticate += ',';
122
}
123
wwwAuthenticate += ' error="' + Hoek.escapeHeaderAttribute(message) + '"';
124
}
125
else {
126
err.isMissing = true;
127
}
128
}
129
else {
130
131
// function (message, wwwAuthenticate[])
132
133
var wwwArray = scheme;
134
for (i = 0, il = wwwArray.length; i < il; ++i) {
135
if (i) {
136
wwwAuthenticate += ', ';
137
}
138
139
wwwAuthenticate += wwwArray[i];
140
}
141
}
142
143
err.output.headers['WWW-Authenticate'] = wwwAuthenticate;
144
145
return err;
146
};
147
148
149
exports.forbidden = function (message, data) {
150
151
return exports.create(403, message, data);
152
};
153
154
155
exports.notFound = function (message, data) {
156
157
return exports.create(404, message, data);
158
};
159
160
161
exports.methodNotAllowed = function (message, data) {
162
163
return exports.create(405, message, data);
164
};
165
166
167
exports.notAcceptable = function (message, data) {
168
169
return exports.create(406, message, data);
170
};
171
172
173
exports.proxyAuthRequired = function (message, data) {
174
175
return exports.create(407, message, data);
176
};
177
178
179
exports.clientTimeout = function (message, data) {
180
181
return exports.create(408, message, data);
182
};
183
184
185
exports.conflict = function (message, data) {
186
187
return exports.create(409, message, data);
188
};
189
190
191
exports.resourceGone = function (message, data) {
192
193
return exports.create(410, message, data);
194
};
195
196
197
exports.lengthRequired = function (message, data) {
198
199
return exports.create(411, message, data);
200
};
201
202
203
exports.preconditionFailed = function (message, data) {
204
205
return exports.create(412, message, data);
206
};
207
208
209
exports.entityTooLarge = function (message, data) {
210
211
return exports.create(413, message, data);
212
};
213
214
215
exports.uriTooLong = function (message, data) {
216
217
return exports.create(414, message, data);
218
};
219
220
221
exports.unsupportedMediaType = function (message, data) {
222
223
return exports.create(415, message, data);
224
};
225
226
227
exports.rangeNotSatisfiable = function (message, data) {
228
229
return exports.create(416, message, data);
230
};
231
232
233
exports.expectationFailed = function (message, data) {
234
235
return exports.create(417, message, data);
236
};
237
238
exports.badData = function (message, data) {
239
240
return exports.create(422, message, data);
241
};
242
243
244
exports.tooManyRequests = function (message, data) {
245
246
return exports.create(429, message, data);
247
};
248
249
250
// 5xx Server Errors
251
252
exports.internal = function (message, data, statusCode) {
253
254
var error = (data instanceof Error ? exports.wrap(data, statusCode, message) : exports.create(statusCode || 500, message));
255
256
if (data instanceof Error === false) {
257
error.data = data;
258
}
259
260
return error;
261
};
262
263
264
exports.notImplemented = function (message, data) {
265
266
return exports.internal(message, data, 501);
267
};
268
269
270
exports.badGateway = function (message, data) {
271
272
return exports.internal(message, data, 502);
273
};
274
275
276
exports.serverTimeout = function (message, data) {
277
278
return exports.internal(message, data, 503);
279
};
280
281
282
exports.gatewayTimeout = function (message, data) {
283
284
return exports.internal(message, data, 504);
285
};
286
287
288
exports.badImplementation = function (message, data) {
289
290
var err = exports.internal(message, data, 500);
291
err.isDeveloperError = true;
292
return err;
293
};
294
295