nodejs http server
http server
var fs = require('fs');
var img = {};
var server = require('http').createServer(request).listen({host,port});
console.log(`http://localhost:${port}`);
function request(req,res){
if(cors(req,res)){
return;
}
var abs = resolve(req.url);
if(!abs){
badrequest(req,res);
return;
}
var f = true;
switch(req.url){
case '/favicon.ico' : favicon(req,res);
default : f = false;
}//switch
if(f){
return;
}
if(!fs.existsSync(abs)){
notfound(req,res);
return;
}
var stream = fs.createReadStream(abs);
var type = mime(abs);
res.writeHead(200,{'content-type':type});
stream.pipe(res);
}//request
function cors(req,res){
cors.headers(res);
if(req.method!='OPTIONS'){
return;
}
res.writeHead(200);
res.end();
}//cors
cors.headers = function(res){
res.setHeader('access-control-allow-origin','*');
}//headers
request.bad = function(req,res){
res.writeHead(400);
res.end(`${req.url} bad request`);
}//bad
request.notfound = function(req,res){
res.writeHEad(400);
res.end(`${req.url} not found`);
}//notfound
function resolve(url,docroot='.'){
url = decodeURI(url);
var p2 = path.resolve(docroot);
var file = path.resolve(docroot,url);
var s = file.substring(0,p2.length);
var p1 = path.resolve(s);
if(p1!==p2){
return false;
}
return file;
}//resolve
function favicon(req,res){
var buf = Buffer.from(img.favicon,'base64');
res.writeHead(200,{'content-type':'image/png'});
res.end(buf);
}//favicon
function mime(fn){
var ext = fn;
var i = fn.lastIndexOf('.');
if(i!=-1){
ext = fn.slice(i+1);
}
switch(ext){
case 'html' : return 'text/html';
case 'css' : return 'text/css';
case 'js' : return 'text/javascript';
}//switch
}//mime
img.favicon =
'iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAABsFBMVEVHcEzY' +
'yZrsuEbkjh7rrDb2ujDwph3bhSTmiRPpggjrrTDgoEHlvmHqhQnbji/shATq' +
'nyfzsRntryb3th33uR3iiBnrkRLvkQjogwrtjAnoixLmgwzzrRz0sB7rnSHy' +
'qRvytB3usCX3vSnuqyf2uBn1uB/2uRv2uhnngQztmRbrlRPtiwXphQnqgwbv' +
'mhDxnw/zoxTvlgzymwv2uCbwlwj3vyn1tBbzqx/5xDX2uBb2uhn////+///t' +
'hADthgDzlQH0lwH6qQHykwD5pgHzkADviAH3pAH7qwH9sAH1mgHtggD+/vvy' +
'jgHwjQH7rQH8+/X5pwHvigD9sQD7uhz60l/379zhgwbikRD0oQT1ngL2nAH5' +
'xUP6yEfgpEfpvF7x5cXx4brunwT06dLphQLs1ajmpB77rAH4vjX8rwHjoS7p' +
'yI3fkifpzqHpjgL2rxz7+O3fjB75shX0qRn1pA77swj5z1jtlADdhxHhsWno' +
'wXXmiAHy3K7pqjDgnDzsoxP69uvv1Zb1tCfuuUHuqA73nwP0rw/5zlT5zFH7' +
'wTLs3L7ps0jgun3jwoLju3nouVLnmArvlstGAAAAO3RSTlMAAxA1Gv19G3Pb' +
'HwwGzRL8P3MrzsJOlea84pqnqtpqylEl72W4RnynkaiO++Xsyt3X1Njv9eWP' +
'8vZilVucdXYAAAIZSURBVCjPjZMHc9owFICZYUMY2bOZ3XsjHFpKIBhju+y9' +
'yw6Ekb1oZlf6lysJTGib3vU7n+/pfVq2nni8fvgKgZL3DwSLS8sGw8LbN7ob' +
'usiX9K8vPJBW5MXyIv93yZ/Vhz3nl27IZcRzPvdS1G+V2rlWxN38iLE3c63w' +
'gq5vrFZ84c7n83b72ZkLvvPNcMRwq6dnn0U2XAjb5+MTHLhy4UkBtyt9eMP2' +
'yQafkz36ahUGsJETa7t6QNx+h7FcVUEiy3QauanO9PIpMcNYIMxhApB0LMnA' +
'JmNZFw9gPd9eX4UEAskYDQCIZ5MB2LRY2jNodf4ktIHD/a87x14jhEwUY/uo' +
'S/3VIPqXM/XTYCzupUkAkIYTkEfeTDbYqM9DLXrcCIYKCay6AEDv/AyeNtDi' +
'okfBUMhciIN++92/FgoFsH66BtkspK49WfSbURJpwUMzYjPq7dmyfwXnptHO' +
'76xgKhlO09EKzjxHO+dNv8f493qjtys48wSfqm7kA8Kf6q39Yxdn7naOc5hy' +
'Op1UyWsEZOpLFX59cRcmnCPCzpEIxyiKYg+qZOpbaStaPjJmfDBBDXMVJb3H' +
'skQ0vl3zEWzad1DObLEsq5Jz5aAYt1qJWs2XtkKItK8Eg7HB62pSj2sIk4ng' +
'gKFsqL8WFdL7JoeJw6EZFf5R58KJB44uGpVU/dc9UAqlEyqZTDZ6e0hy8zXi' +
'qyUSiYL3//wC2BenWkIiIBYAAAAASUVORK5CYII='