simplehttpserver.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /**
  2. * a barebones HTTP server in JS
  3. * to serve three.js easily
  4. *
  5. * @author zz85 https://github.com/zz85
  6. *
  7. * Usage: node simplehttpserver.js <port number>
  8. *
  9. * do not use in production servers
  10. * and try
  11. * npm install http-server -g
  12. * instead.
  13. */
  14. var port = 8000,
  15. http = require( 'http' ),
  16. urlParser = require( 'url' ),
  17. fs = require( 'fs' ),
  18. path = require( 'path' ),
  19. currentDir = process.cwd(),
  20. mimeTypes = {
  21. "html": "text/html",
  22. "js": "text/javascript",
  23. "css": "text/css",
  24. "jpg": "image/jpeg",
  25. "png": "image/png",
  26. "gif": "image/gif",
  27. "ogg": "audio/ogg",
  28. "mp3": "audio/mpeg",
  29. "mp4": "video/mp4",
  30. "txt": "text/plain",
  31. "bin": "application/octet-stream"
  32. };
  33. // https://github.com/parshap/node-sanitize-filename/blob/master/index.js#L33-L47
  34. var illegalRe = /[\?<>:\*\|":]/g;
  35. var controlRe = /[\x00-\x1f\x80-\x9f]/g;
  36. var reservedRe = /^\.+$/;
  37. var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i;
  38. var windowsTrailingRe = /[\. ]+$/;
  39. function sanitize( input ) {
  40. var sanitized = input
  41. .replace( /\//g, "\\" )
  42. .replace( illegalRe, "" )
  43. .replace( controlRe, "" )
  44. .replace( reservedRe, "" )
  45. .replace( windowsReservedRe, "" )
  46. .replace( windowsTrailingRe, "" );
  47. return sanitized;
  48. }
  49. port = process.argv[ 2 ] ? parseInt( process.argv[ 2 ], 0 ) : port;
  50. function handleRequest( request, response ) {
  51. var urlObject = urlParser.parse( request.url, true );
  52. var pathname = decodeURIComponent( sanitize( urlObject.pathname ) );
  53. console.log( '[' + ( new Date() ).toUTCString() + '] ' + '"' + request.method + ' ' + pathname + '"' );
  54. var filePath = path.join( currentDir, pathname );
  55. fs.stat( filePath, function ( err, stats ) {
  56. if ( err ) {
  57. response.writeHead( 404, {} );
  58. response.end( 'File not found!' );
  59. return;
  60. }
  61. if ( stats.isFile() ) {
  62. fs.readFile( filePath, function ( err, data ) {
  63. if ( err ) {
  64. response.writeHead( 404, {} );
  65. response.end( 'Opps. Resource not found' );
  66. return;
  67. }
  68. var fileType = filePath.split( '.' ).pop().toLowerCase();
  69. response.writeHead( 200, {
  70. "Content-Type": mimeTypes[ fileType ] || mimeTypes[ 'bin' ]
  71. } );
  72. response.write( data );
  73. response.end();
  74. } );
  75. } else if ( stats.isDirectory() ) {
  76. fs.readdir( filePath, function ( error, files ) {
  77. if ( error ) {
  78. response.writeHead( 500, {} );
  79. response.end();
  80. return;
  81. }
  82. var l = pathname.length;
  83. if ( pathname.substring( l - 1 ) != '/' ) pathname += '/';
  84. response.writeHead( 200, { 'Content-Type': 'text/html' } );
  85. response.write( '<!DOCTYPE html>\n<html><head><meta charset="UTF-8"><title>' + filePath + '</title></head><body>' );
  86. response.write( '<h1>' + filePath + '</h1>' );
  87. response.write( '<ul style="list-style:none;font-family:courier new;">' );
  88. files.unshift( '.', '..' );
  89. files.forEach( function ( item ) {
  90. var urlpath = path.join( pathname, item ),
  91. itemStats = fs.statSync( path.join( currentDir, urlpath ) );
  92. if ( itemStats.isDirectory() ) {
  93. urlpath += '/';
  94. item += '/';
  95. }
  96. response.write( '<li><a href="' + urlpath + '">' + item + '</a></li>' );
  97. } );
  98. response.end( '</ul></body></html>' );
  99. } );
  100. }
  101. } );
  102. }
  103. http.createServer( handleRequest ).listen( port );
  104. require( 'dns' ).lookup( require( 'os' ).hostname(), function ( err, addr ) {
  105. console.log( 'Running at http://' + addr + ( ( port === 80 ) ? '' : ':' ) + port + '/' );
  106. } );
  107. console.log( 'Three.js server has started...' );
  108. console.log( 'Base directory at ' + currentDir );