forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			132 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			132 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | #!/usr/bin/env node
 | ||
|  | 
 | ||
|  | var fs = require('fs'), | ||
|  |     tty = require('tty'), | ||
|  |     statik = require('./../lib/node-static'); | ||
|  | 
 | ||
|  |     var argv = require('optimist') | ||
|  |         .usage([ | ||
|  |             'USAGE: $0 [-p <port>] [<directory>]', | ||
|  |             'simple, rfc 2616 compliant file streaming module for node'] | ||
|  |             .join('\n\n')) | ||
|  |         .option('port', { | ||
|  |             alias: 'p', | ||
|  |             'default': 8080, | ||
|  |             description: 'TCP port at which the files will be served' | ||
|  |         }) | ||
|  |         .option('host-address', { | ||
|  |             alias: 'a', | ||
|  |             'default': '127.0.0.1', | ||
|  |             description: 'the local network interface at which to listen' | ||
|  |         }) | ||
|  |         .option('cache', { | ||
|  |             alias: 'c', | ||
|  |             description: '"Cache-Control" header setting, defaults to 3600' | ||
|  |         }) | ||
|  |         .option('version', { | ||
|  |             alias: 'v', | ||
|  |             description: 'node-static version' | ||
|  |         }) | ||
|  |         .option('headers', { | ||
|  |             alias: 'H', | ||
|  |             description: 'additional headers (in JSON format)' | ||
|  |         }) | ||
|  |         .option('header-file', { | ||
|  |             alias: 'f', | ||
|  |             description: 'JSON file of additional headers' | ||
|  |         }) | ||
|  |         .option('gzip', { | ||
|  |             alias: 'z', | ||
|  |             description: 'enable compression (tries to serve file of same name plus \'.gz\')' | ||
|  |         }) | ||
|  |         .option('spa', { | ||
|  |             description: 'serve the content as a single page app by redirecting all non-file requests to the index html file' | ||
|  |         }) | ||
|  |         .option('indexFile', { | ||
|  |             alias: 'i', | ||
|  |             'default': 'index.html', | ||
|  |             description: 'specify a custom index file when serving up directories' | ||
|  |         }) | ||
|  |         .option('help', { | ||
|  |             alias: 'h', | ||
|  |             description: 'display this help message' | ||
|  |         }) | ||
|  |         .argv; | ||
|  | 
 | ||
|  |     var dir = argv._[0] || '.'; | ||
|  | 
 | ||
|  |     var colors = require('colors'); | ||
|  | 
 | ||
|  |     var log = function(request, response, statusCode) { | ||
|  |         var d = new Date(); | ||
|  |         var seconds = d.getSeconds() < 10? '0'+d.getSeconds() : d.getSeconds(), | ||
|  |             datestr = d.getHours() + ':' + d.getMinutes() + ':' + seconds, | ||
|  |             line = datestr + ' [' + response.statusCode + ']: ' + request.url, | ||
|  |             colorized = line; | ||
|  |         if (tty.isatty(process.stdout.fd)) | ||
|  |             colorized = (response.statusCode >= 500) ? line.red.bold : | ||
|  |                         (response.statusCode >= 400) ? line.red : | ||
|  |                         line; | ||
|  |         console.log(colorized); | ||
|  |     }; | ||
|  | 
 | ||
|  |     var file, options; | ||
|  | 
 | ||
|  | if (argv.help) { | ||
|  |     require('optimist').showHelp(console.log); | ||
|  |     process.exit(0); | ||
|  | } | ||
|  | 
 | ||
|  | if (argv.version) { | ||
|  |     console.log('node-static', statik.version.join('.')); | ||
|  |     process.exit(0); | ||
|  | } | ||
|  | 
 | ||
|  | if (argv.cache) { | ||
|  |     (options = options || {}).cache = argv.cache; | ||
|  | } | ||
|  | 
 | ||
|  | if (argv.headers) { | ||
|  |     (options = options || {}).headers = JSON.parse(argv.headers); | ||
|  | } | ||
|  | 
 | ||
|  | if (argv['header-file']) { | ||
|  |     (options = options || {}).headers = | ||
|  |         JSON.parse(fs.readFileSync(argv['header-file'])); | ||
|  | } | ||
|  | 
 | ||
|  | if (argv.gzip) { | ||
|  |     (options = options || {}).gzip = true; | ||
|  | } | ||
|  | 
 | ||
|  | if (argv.indexFile) { | ||
|  |     (options = options || {}).indexFile = argv['indexFile']; | ||
|  | } | ||
|  | 
 | ||
|  | file = new(statik.Server)(dir, options); | ||
|  | 
 | ||
|  | require('http').createServer(function (request, response) { | ||
|  |     request.addListener('end', function () { | ||
|  |         var callback = function(e, rsp) { | ||
|  |           if (e && e.status === 404) { | ||
|  |               response.writeHead(e.status, e.headers); | ||
|  |               response.end("Not Found"); | ||
|  |               log(request, response); | ||
|  |           } else { | ||
|  |               log(request, response); | ||
|  |           } | ||
|  |         }; | ||
|  | 
 | ||
|  |         if (argv['spa'] && request.url.indexOf(".") == -1) { | ||
|  |             file.serveFile(argv['indexFile'], 500, {}, request, response); | ||
|  |         } else { | ||
|  |             file.serve(request, response, callback); | ||
|  |         } | ||
|  |     }).resume(); | ||
|  | }).listen(+argv.port, argv['host-address']); | ||
|  | 
 | ||
|  | console.log('serving "' + dir + '" at http://' + argv['host-address'] + ':' + argv.port); | ||
|  | if (argv.spa) { | ||
|  |   console.log('serving as a single page app (all non-file requests redirect to ' + argv['indexFile'] +')'); | ||
|  | } |