shunter
Version:
A Node.js application built to read JSON and translate it into HTML
88 lines (75 loc) • 2.68 kB
JavaScript
;
module.exports = function (config) {
var statsd = require('./statsd')(config);
var outputFilter = require('./output-filter')(config);
var contentType = require('./content-type');
var http = require('http');
var getErrorMessage = function (err) {
return err.message || err.toString();
};
var api = {
send: function (err, out, req, res, status) {
var timer = config.timer();
var mimeType;
var logError = function (err, status) {
config.log.error(err.stack ? err.stack : getErrorMessage(err));
statsd.increment('errors_' + status);
};
var doSend = function (content) {
var length = Buffer.byteLength(content);
if (!mimeType) {
mimeType = contentType(req.url, {charset: 'utf-8'});
}
statsd.classifiedTiming(req.url, 'writing', timer('Writing response ' + req.url));
statsd.classifiedGauge(req.url, 'response_size', length);
statsd.increment('requests');
res.setHeader('Content-type', mimeType);
res.setHeader('Content-length', length);
res.writeHead(status);
res.end(content);
};
var getErrorContent = function (err, req, res) {
mimeType = contentType('anything.html', {charset: 'utf-8'});
require('./error-pages')(config).getPage(err, req, res, function (content) {
doSend(content || api.error(err, status));
});
};
if (!status) {
status = 200;
}
if (err) {
status = err.status || 500;
getErrorContent(err, req, res);
logError(err, status);
} else if (req.isJson) {
mimeType = 'application/json; charset=utf-8';
doSend(out);
} else {
doSend(outputFilter(out, contentType(req.url), req));
}
},
error: function (err, status) {
var statusMessage = http.STATUS_CODES[status] || 'Internal server error';
var out = [
'<!DOCTYPE html><html lang="en"><head><title>' + statusMessage + '</title>',
'</head>',
'<body><div style="font-family: sans-serif; color: gray; font-size: 20px; font-weight: bold; margin-top: 200px; text-align: center;">' + status + ' – ' + statusMessage + '</div>',
'\n<!--\n\n',
function () {/*
___ _ _
/ __| | |_ _ _ _ _ | |_ ___ _ _
\__ \ | ' \ | +| | | ' \ | _| / -_) | '_|
|___/ |_||_| \_,_| |_||_| _\__| \___| _|_|_
_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|_|"""""|
"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'
*/}.toString().replace(/^[^\*]+\*/, '').replace(/\*\/.$/, ''),
'\n\n\n',
'Error: ' + getErrorMessage(err) + '\n',
'-->\n',
'</body></html>'
].join('');
return out;
}
};
return api;
};