var KB = 1024;
var MB = 1048576;
var GB = 1073741824;
var SECOND = 1000;
var MINUTE = 60000;
var HOUR = 3600000;
var DAY = 86400000;
var WEEK = 604800000;
var MONTH = 2628000000;
var YEAR = 31536000000;
// добавляем свои
var ALLOWED_METHODS = ['GET', 'POST'];
var LISTEN_PORT = 8080;
var STATIC_FILES_DIRECTORY = './public';
var MAX_REQUEST_LENGTH = 4 * MB;
var http = require('http');
var fs = require('fs');
var qs = require('querystring');
var url = require('url');
var path = require('path');
var util = require('util');
var routes = {
GET: [
['/', function(rq, rs) {
rs.writeHead(202, {'content-type': 'text/html'});
rs.end('<form action="/login" method="post">' +
'<input name="username" placeholder="Введите имя">\n' +
'<input name="password" type="password" placeholder="Введите пароль">\n' +
'<input type="submit"></form>');
}],
['/index.htm', function(rq, rs) {
rs.writeHead(302, {location: '/', connection: 'close'})
rs.end();
}],
],
POST: [
['/login', function(rq, rs) {
rs.end(JSON.stringify(rq.body));
}],
]
};
// var fs = require('fs');
// var path = require('path');
//
// module.exports = new function() {
var mime = new function() {
// используется от Apache
var MIME_TYPES_FILENAME = './mime.types';
var DEFAULT_MIME_TYPE = '*'; // application/octet-stream
var types = {};
var extensions = {};
var content = fs.readFileSync(MIME_TYPES_FILENAME, 'ascii');
var pos = 0;
var start = 0;
while ((pos = content.indexOf('\n', start)) > -1) {
var line = content.substr(start, pos - start);
// удаляем комментарии и пробелы на концах строки
line = line.replace(/#.*/, '');
line = line.trim();
if (line) {
var fields = line.split(/\t+|\s+/);
var type = fields.shift();
extensions[type] = fields[0];
var extension;
var i = 0;
while (extension = fields[i++]) {
types[extension] = type;
}
}
start = pos + 1;
}
// mime.getTypeByExtension('.ext');
this.getTypeByExtension = function(extension) {
extension = extension.split('.')[1];
return extension && types[extension] ? types[extension] : DEFAULT_MIME_TYPE;
}
// mime.getTypeByFilename('path/to/file.ext');
this.getTypeByFilename = function(filename) {
return this.getTypeByExtension(path.extname(filename));
}
// mime.getExtensionByType('type/subtype');
this.getExtensionByType = function(type) {
return extensions[type] ? '.' + extensions[type] : '';
}
}; // ошибка без ';'
// var mime = require('./mime');
(function() {
// ServerRequest является объектом IncomingMessage
var rq = http.IncomingMessage.prototype;
var rs = http.ServerResponse.prototype;
rs.setCookie = function(name, value, expires, path, domain, secure, httponly) {
var cookies = this.getHeader('set-cookie');
if (cookies === undefined) {
cookies = [];
}
else if (typeof cookies == 'string') {
cookies = [].concat(cookies);
}
cookies.push(name + '=' + qs.escape(value) +
(expires === undefined ? '' : '; Expires=' + new Date(expires).toUTCString()) +
(path ? '; Path=' + path : '') + (domain ? '; Domain=' + domain : '') +
(secure ? '; Secure' : '') + (httponly ? '; HttpOnly' : ''));
this.setHeader('set-cookie', cookies);
}
rs.removeCookie = function(name, path, domain) {
this.setCookie(name, '', 0, path, domain);
}
})();
var server = http.createServer(function(rq, rs) {
// метод не поддерживается, отсылаем заголовки ничего не выводим
if (ALLOWED_METHODS.indexOf(rq.method) == -1) {
rq.pause();
rs.writeHead(405, {connection: 'close'});
return rs.end();
}
var urlObj = url.parse(rq.url);
rq.path = qs.unescape(urlObj.pathname);
rq.query = urlObj.query;
rq.hash = urlObj.hash;
rq.cookies = qs.parse(rq.headers['cookie'], '; ');
rq.isXhr = rq.headers['x-requested-with'] == 'XMLHttpRequest';
rq.body = [];
// ищем обработчик пути
var runRoute;
if (routes[rq.method]) {
var subroutes = routes[rq.method];
var route;
var i = 0;
while (route = subroutes[i++]) {
if (route[0] instanceof RegExp) {
var matches = rq.path.match(route[0]);
if (matches) {
runRoute = function() {
route[1].apply(null, [rq, rs].concat(matches.slice(1)))
}
break;
}
}
else if (route[0] === rq.path) {
runRoute = function() {
route[1](rq, rs);
}
break;
}
}
}
// если его нет отдаем статику
if (!runRoute) {
rq.pause();
console.log('serve static files');
var filename = STATIC_FILES_DIRECTORY + rq.path;
fs.exists(filename, function(exists) {
if (!exists) {
rs.writeHead(404, {connection: 'close'});
rs.end('404 Not Found\n');
return;
}
fs.readFile(filename, function(err, content) {
if (err) {
// файл является директорией или ?
rs.writeHead(500, {connection: 'close'});
rs.end('500 Internal Server Error\n');
return;
}
rs.writeHead(200, {'content-type': mime.getTypeByFilename(filename)});
rs.end(content);
});
});
// вышли
return;
}
var requestLength = rq.headers['content-length'] > MAX_REQUEST_LENGTH ? MAX_REQUEST_LENGTH : 0;
rq.on('data', function(chunk) {
requestLength += chunk.length;
if (requestLength > MAX_REQUEST_LENGTH) {
// ждем когда сборщик мусора убьёт поток
rq.pause();
rs.writeHead(413, {connection: 'close'});
rs.end();
console.log('maximum request length exceeded');
return;
}
this.body.push(chunk);
});
// ждем пока клиент не закончит передачу данных
rq.on('end', function() {
console.log('bytes recieved ' + requestLength);
this.body = Buffer.concat(this.body);
if (this.method == 'POST' && this.headers['content-type'] == 'application/x-www-form-urlencoded') {
this.body = qs.parse(this.body.toString());
}
// вызываем обработчик
runRoute();
});
});
server.listen(LISTEN_PORT);
console.log('server was started');
Вот тут все ли правильно я делаю?