Commit 32b4f842 authored by John Crepezzi's avatar John Crepezzi
Browse files

serve 404 when not possible key

parent 9ed330bd
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
cache headers for static assets (and on document GET)
tests
add FAVICON (or force 404)
add feedback for errors to UI - esp. too long
add about page

+5 −0
Original line number Diff line number Diff line
@@ -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
DocumentHandler.prototype.randomKey = function() {
  var text = '';
+30 −17
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@ var fs = require('fs');

var winston = require('winston');

var DocumentHandler = require('./document_handler');

// For serving static assets

var StaticHandler = function(path, cacheAssets) {
@@ -33,17 +35,38 @@ 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);
  // If this is a potential key, show the index - otherwise
  // bust out a 404
  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
  var filePath = this.basePath + (incPath == '/' ? this.defaultPath : incPath);
  var cached = this.cacheAssets && this.isCached(filePath);
  var method = cached ? this.serveCached : this.retrieve;
  // Run!
  // Go get'er
  var _this = this;
  var method = cached ? this.serveCached : this.retrieve;
  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
    if (content) {
    else {
      var contentType = StaticHandler.contentTypeFor(path.extname(filePath));
      response.writeHead(200, { 'content-type': contentType });
      response.end(content, 'utf-8');
@@ -52,16 +75,6 @@ StaticHandler.prototype.handle = function(incPath, response) {
        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;
      }
    }
  }); 
};