serve 404 when not possible key

raw_icon
John Crepezzi 14 years ago
parent 9ed330bdae
commit 32b4f842b7
  1. 1
      TODO
  2. 5
      lib/document_handler.js
  3. 47
      lib/static_handler.js

@ -1,6 +1,5 @@
cache headers for static assets (and on document GET) cache headers for static assets (and on document GET)
tests tests
add FAVICON (or force 404)
add feedback for errors to UI - esp. too long add feedback for errors to UI - esp. too long
add about page add about page

@ -78,6 +78,11 @@ DocumentHandler.prototype.chooseKey = function(callback) {
}); });
}; };
// Return a boolean indicating whether or not something can be a key
DocumentHandler.potentialKey = function(key) {
return key.match(/^[a-zA-Z0-9]+$/);
};
// Generate a random key // Generate a random key
DocumentHandler.prototype.randomKey = function() { DocumentHandler.prototype.randomKey = function() {
var text = ''; var text = '';

@ -3,6 +3,8 @@ var fs = require('fs');
var winston = require('winston'); var winston = require('winston');
var DocumentHandler = require('./document_handler');
// For serving static assets // For serving static assets
var StaticHandler = function(path, cacheAssets) { var StaticHandler = function(path, cacheAssets) {
@ -33,17 +35,38 @@ StaticHandler.contentTypeFor = function(ext) {
// Handle a request, and serve back the asset if it exists // Handle a request, and serve back the asset if it exists
StaticHandler.prototype.handle = function(incPath, response) { StaticHandler.prototype.handle = function(incPath, response) {
// Go to index if not found or / // If this is a potential key, show the index - otherwise
if (!this.availablePaths[incPath]) incPath = this.defaultPath; // bust out a 404
var filePath = this.basePath + (incPath == '/' ? this.defaultPath : incPath); if (!this.availablePaths[incPath]) {
if (incPath === '/' || DocumentHandler.potentialKey(incPath.substring(1))) {
incPath = this.defaultPath;
}
else {
winston.warn('failed to find static asset', { path: incPath });
response.writeHead(404, { 'content-type': 'application/json' });
response.end(JSON.stringify({ message: 'no such file' }));
return;
}
}
// And then stream the file back - either from the cache or from source // And then stream the file back - either from the cache or from source
var filePath = this.basePath + (incPath == '/' ? this.defaultPath : incPath);
var cached = this.cacheAssets && this.isCached(filePath); var cached = this.cacheAssets && this.isCached(filePath);
var method = cached ? this.serveCached : this.retrieve; // Go get'er
// Run!
var _this = this; var _this = this;
var method = cached ? this.serveCached : this.retrieve;
method(filePath, function(error, content) { method(filePath, function(error, content) {
// detect errors
if (error) {
winston.error('unable to read file', { path: filePath, error: error });
response.writeHead(500, { 'content-type': 'application/json' });
response.end(JSON.stringify({ message: 'IO: Unable to read file' }));
// If it was cached, bust the cache
if (cached) {
StaticHandler.cache[filePath] = null;
}
}
// Get the content // Get the content
if (content) { else {
var contentType = StaticHandler.contentTypeFor(path.extname(filePath)); var contentType = StaticHandler.contentTypeFor(path.extname(filePath));
response.writeHead(200, { 'content-type': contentType }); response.writeHead(200, { 'content-type': contentType });
response.end(content, 'utf-8'); response.end(content, 'utf-8');
@ -52,16 +75,6 @@ StaticHandler.prototype.handle = function(incPath, response) {
StaticHandler.cache[filePath] = content; StaticHandler.cache[filePath] = content;
} }
} }
// Or break down and cry
else {
winston.error('unable to read file', { path: filePath, error: error });
response.writeHead(500, { 'content-type': 'application/json' });
response.end(JSON.stringify({ message: 'IO: Unable to read file' }));
// If it was cached, bust the cache
if (cached) {
StaticHandler.cache[filePath] = null;
}
}
}); });
}; };
@ -71,7 +84,7 @@ StaticHandler.prototype.retrieve = function(filePath, callback) {
winston.verbose('loading static asset', { path: filePath }); winston.verbose('loading static asset', { path: filePath });
fs.readFile(filePath, function(error, content) { fs.readFile(filePath, function(error, content) {
callback(error, content); callback(error, content);
}); });
}; };
// Retrieve from memory cache // Retrieve from memory cache

Loading…
Cancel
Save