Skip to content

Instantly share code, notes, and snippets.

@comfuture
Created September 10, 2010 13:56
Show Gist options
  • Save comfuture/573666 to your computer and use it in GitHub Desktop.
Save comfuture/573666 to your computer and use it in GitHub Desktop.
nano framework for node.js
with (require('./nano')) {
get('/hello', 'Hello, world');
get('/index.html', readfile('index.html'));
static_file('/about.html');
get('/bye', function() {
return 'Bye~ ' + request.args['name'];
});
get('/rand', function() {
return '' + Math.ceil(Math.random() * 100000);
});
get(/\/greet\/(.*)/, function(match) {
return 'Halo, ' + match[1];
});
server.listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
}
var http = require('http');
var URL = require('url');
var fs = require('fs');
COMMON_HEADERS = {};
var urlmap = {
'GET': [], 'POST': [], 'PUT': [], 'DELETE': []
};
function isArray(o) {
return (o.constructor.toString().indexOf('Array') > -1);
}
function error(code, message)
{
exports.response.writeHead(code);
exports.response.end(message);
}
exports.error = error;
function write(content, headers) {
exports.response.writeHead(200, {'Content-Type': 'text/html'});
exports.response.end(content);
}
exports.write = write;
function readfile(filename) {
return function() {
return fs.readFileSync(filename);
}
}
exports.readfile = readfile;
function addrule(method, pattern, func) {
if (isArray(method)) {
for (m in method) {
addrule(m, pattern, func);
}
return;
}
var pair = [pattern, func];
urlmap[method.toUpperCase()].push(pair);
}
exports.addrule = addrule;
/*
for (method in urlmap) {
console.log('method added:', method);
exports[method.toLowerCase()] = function(pattern, func) {
addrule(method, pattern, func);
}
}
*/
exports.get = function(pattern, func) {
addrule('GET', pattern, func);
};
exports.post = function(pattern, func) {
addrule('POST', pattern, func);
}
exports.static_file = function(path) {
addrule('GET', path, readfile(path.substr(1)));
}
exports.static_dir = function(dir) {
addrule('GET', new RegExp('^'+dir+'/(.*)'), function(match) {
readfile(match);
});
}
function _do_response(req, res) {
var _parsed = URL.parse(req.url, true);
req.path = _parsed.pathname;
req.args = _parsed.query;
exports.request = req;
exports.response = res;
var error = function(code, message) {
exports.response.writeHead(404);
exports.response.end('404 Not Found');
}
var method = req.method.toUpperCase();
var _make_response = function(ret, match) {
if (typeof ret == 'string') {
write(ret);
return true;
} else if (typeof ret == 'function') {
write(ret(match));
return true;
} else if (isArray(ret)) {
// do something
}
return false;
}
for (var i = 0, cnt = urlmap[method].length; i < cnt; i++) {
var ret = false;
var pattern = urlmap[method][i][0];
if (typeof pattern.test == 'function') {
var match = pattern.exec(req.path);
if (match)
ret = _make_response(urlmap[method][i][1], match);
} else if (typeof pattern == 'string' && pattern == req.path) {
ret = _make_response(urlmap[method][i][1]);
}
if (ret) {
return;
}
}
error(404);
}
exports.server = http.createServer(_do_response);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment