|
@@ -2,6 +2,7 @@
|
|
|
var fs = require('fs'),
|
|
|
url = require('url'),
|
|
|
path = require('path'),
|
|
|
+ vm = require('vm'),
|
|
|
mimeTypes = {
|
|
|
'html': 'text/html',
|
|
|
'js': 'text/javascript',
|
|
@@ -13,40 +14,93 @@ var fs = require('fs'),
|
|
|
req.addListener('end',function(){
|
|
|
logger.debug('served static content for '+req.url);
|
|
|
var uri = url.parse(req.url).pathname,
|
|
|
- filename = path.join('./www/',unescape(uri)),
|
|
|
- stats;
|
|
|
- try{
|
|
|
- stats = fs.lstatSync(filename);
|
|
|
- }catch(e){
|
|
|
- res.writeHead(404,{
|
|
|
- 'Content-type': 'text/plain'
|
|
|
- });
|
|
|
- res.write('404 Not Found\n');
|
|
|
- res.end();
|
|
|
- return;
|
|
|
- }
|
|
|
- if(stats.isFile()){
|
|
|
- var fileStream,
|
|
|
- mimetype = mimeTypes[path.extname(filename).split('.')[1]];
|
|
|
- res.writeHead(200,{
|
|
|
- 'Content-Type': mimetype
|
|
|
+ serveFile = function(filename,req,res){
|
|
|
+ try{
|
|
|
+ stats = fs.lstatSync(filename);
|
|
|
+ }catch(e){
|
|
|
+ res.writeHead(404,{
|
|
|
+ 'Content-type': 'text/plain'
|
|
|
+ });
|
|
|
+ res.write('404 Not Found\n');
|
|
|
+ res.end();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(stats.isFile()){
|
|
|
+ var fileStream,
|
|
|
+ mimetype = mimeTypes[path.extname(filename).split('.')[1]];
|
|
|
+ res.writeHead(200,{
|
|
|
+ 'Content-Type': mimetype
|
|
|
+ });
|
|
|
+ fileStream = fs.createReadStream(filename);
|
|
|
+ fileStream.pipe(res);
|
|
|
+ }else if(stats.isDirectory()){
|
|
|
+ if(fs.existsSync(path.join(filename,'index.html'))){
|
|
|
+ serveFile(path.join(filename,'index.html'),req,res);
|
|
|
+ }else if(fs.existsSync(path.join(filename,'index.htm'))){
|
|
|
+ serveFile(path.join(filename,'index.htm'),req,res);
|
|
|
+ }else if(fs.existsSync(path.join(filename,'index.txt'))){
|
|
|
+ serveFile(path.join(filename,'index.txt'),req,res);
|
|
|
+ }else{
|
|
|
+ res.writeHead(200,{
|
|
|
+ 'Content-Type': 'text/plain'
|
|
|
+ });
|
|
|
+ res.write('Index of '+url+'\n');
|
|
|
+ res.write('TODO, show index');
|
|
|
+ res.end();
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ res.writeHead(500,{
|
|
|
+ 'Content-Type': 'text/plain'
|
|
|
+ });
|
|
|
+ res.write('500 Internal server error\n');
|
|
|
+ res.end();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ filepath = unescape(uri);
|
|
|
+ if(filepath.substr(0,5) == '/api/'){
|
|
|
+ filepath = path.join('./api/',filepath.substr(5));
|
|
|
+ logger.debug('Attempting to run api script '+filepath);
|
|
|
+ if(fs.existsSync(filepath)){
|
|
|
+ fs.readFile(filepath,function(e,data){
|
|
|
+ if(e){
|
|
|
+ logger.error(e);
|
|
|
+ res.end('null;');
|
|
|
+ }else{
|
|
|
+ var output = '',
|
|
|
+ sandbox = {
|
|
|
+ log: function(text){
|
|
|
+ output += text;
|
|
|
+ },
|
|
|
+ error: function(msg){
|
|
|
+ logger.error(msg);
|
|
|
+ },
|
|
|
+ info: function(msg){
|
|
|
+ logger.info(msg);
|
|
|
+ },
|
|
|
+ debug: function(msg){
|
|
|
+ logger.debug(msg);
|
|
|
+ },
|
|
|
+ head: {
|
|
|
+ 'Content-Type': 'text/javascript'
|
|
|
+ },
|
|
|
+ returnCode: 200,
|
|
|
+ vm: vm,
|
|
|
+ fs: fs
|
|
|
+ };
|
|
|
+ vm.runInNewContext(data,sandbox,filepath);
|
|
|
+ res.writeHead(sandbox.returnCode,sandbox.head);
|
|
|
+ res.end(output);
|
|
|
+ }
|
|
|
});
|
|
|
- fileStream = fs.createReadStream(filename);
|
|
|
- fileStream.pipe(res);
|
|
|
- }else if(stats.isDirectory()){
|
|
|
- res.writeHead(200,{
|
|
|
- 'Content-Type': 'text/plain'
|
|
|
- });
|
|
|
- res.write('Index of '+url+'\n');
|
|
|
- res.write('TODO, show index');
|
|
|
- res.end();
|
|
|
}else{
|
|
|
- res.writeHead(500,{
|
|
|
- 'Content-Type': 'text/plain'
|
|
|
+ res.writeHead(404,{
|
|
|
+ 'Content-Type': 'text/javascript'
|
|
|
});
|
|
|
- res.write('500 Internal server error\n');
|
|
|
- res.end();
|
|
|
+ res.end('null;');
|
|
|
}
|
|
|
+ }else{
|
|
|
+ serveFile(path.join('./www/',filepath),req,res);
|
|
|
+ }
|
|
|
}).resume();
|
|
|
}).listen(80),
|
|
|
io = require('socket.io').listen(app)
|