var http = require('http'),
url = require('url'),
fs = require('fs'),
mime = require('mime'),
swig = require('swig');
/** Front-end директория */
var WDIR = './web',
/** Директория шаблонов ошибок */
EDIR = WDIR + '/_errors',
/** Путь к макету сайта */
LAYOUT = WDIR + '/layout.html',
/** Файлы которые нельзя вызвать по ссылке */
EXCLUDE = [LAYOUT],
/** Кодировка на сервере */
CHARSET = 'UTF-8';
/** Запускаем сервер */
http.createServer(function(req, res) {
res.setHeader('Content-Type', 'text/plain; charset=' + CHARSET);
var pathToFile = url.parse(req.url).pathname;
pathToFile = pathToFile == '/' ? '/index.html' : pathToFile;
display(res, WDIR + pathToFile);
}).listen(80);
/**
* Открываем файл в окне браузера
*
* @param res
* @param pathToFile
* @param isError - если пытаемся показать шаблон ошибки
*/
function display(res, pathToFile, isError)
{
if (in_array(pathToFile, EXCLUDE)) {
getError(isError, res, 404);
return;
}
fs.readFile(pathToFile, function(err, data) {
if (err) {
getError(isError, res, 404);
return;
}
var mimeFile = setHeader(res, pathToFile);
if (mimeFile == 'text/html') {
swig.setDefaults({ cache: false });
data = swig.render(data.toString(), {
filename: LAYOUT
});
}
res.end(data);
});
}
/**
* Установка заголовка
*
* @param res
* @param pathToFile
* @returns {string} MIME-файла или Content-Type
*/
function setHeader(res, pathToFile)
{
var mimeFile = mime.lookup(pathToFile);
res.setHeader('Content-Type', mimeFile + '; charset=' + CHARSET);
return mimeFile;
}
/**
* Возвращаем ошибку
*
* @param mode - без шаблонный режим, если шаблон не загрузился
* для исключения зацикливания при невозможности загрузить шаблон ошибки
* @param res
* @param code - код ошибки
*/
function getError(mode, res, code)
{
var template = EDIR + '/' + code + '.html';
if (mode) {
console.error('Отсутствует шаблон ошибки: ' + template);
res.end('Произошла ошибка!');
} else {
res.statusCode = code;
display(res, template, 1);
}
}
/**
* Проверка наличия элемента в массиве по значению
*
* @param value
* @param array
* @returns {boolean}
*/
function in_array(value, array) {
for(var i = 0; i < array.length; i++) {
if(array[i] == value) return true;
}
return false;
}