diff --git a/lib/static_handler.js b/lib/static_handler.js index 15e5560..89b93c0 100644 --- a/lib/static_handler.js +++ b/lib/static_handler.js @@ -8,6 +8,12 @@ var winston = require('winston'); var StaticHandler = function(path) { this.basePath = path; this.defaultPath = '/index.html'; + // Grab the list of available files - and move into hash for quick lookup + var available = fs.readdirSync(this.basePath); + this.availablePaths = {}; + for (var i = 0; i < available.length; i++) { + this.availablePaths['/' + available[i]] = true; + } }; // Determine the content type for a given extension @@ -24,28 +30,23 @@ StaticHandler.contentTypeFor = function(ext) { // Handle a request, and serve back the asset if it exists StaticHandler.prototype.handle = function(incPath, response) { + // Go to index if not found or / + if (!this.availablePaths[incPath]) incPath = this.defaultPath; var filePath = this.basePath + (incPath == '/' ? this.defaultPath : incPath); + // And then stream the file back var _this = this; - path.exists(filePath, function(exists) { - if (exists) { - fs.readFile(filePath, function(error, content) { - if (error) { - winston.error('unable to read file', { path: filePath, error: error.message }); - response.writeHead(500, { 'content-type': 'application/json' }); - response.end(JSON.stringify({ message: 'IO: Unable to read file' })); - } - else { - var contentType = StaticHandler.contentTypeFor(path.extname(filePath)); - response.writeHead(200, { 'content-type': contentType }); - response.end(content, 'utf-8'); - } - }); + fs.readFile(filePath, function(error, content) { + if (error) { + winston.error('unable to read file', { path: filePath, error: error.message }); + response.writeHead(500, { 'content-type': 'application/json' }); + response.end(JSON.stringify({ message: 'IO: Unable to read file' })); } else { - // serve the default route so that pushstate can work if not found - _this.handle('/', response); + var contentType = StaticHandler.contentTypeFor(path.extname(filePath)); + response.writeHead(200, { 'content-type': contentType }); + response.end(content, 'utf-8'); } - }); + }); }; module.exports = StaticHandler; diff --git a/server.js b/server.js index 08a03f6..5fb28bb 100644 --- a/server.js +++ b/server.js @@ -26,7 +26,6 @@ if (config.logging) { } } -// TODO preparse static instead of using exists // TODO implement command line // Set the server up