Commit 0471b059 authored by John Crepezzi's avatar John Crepezzi
Browse files

Support a form-data POST API

Closes #54
parent 7a089604
Loading
Loading
Loading
Loading
+43 −17
Original line number Diff line number Diff line
var winston = require('winston');
var Busboy = require('busboy');

// For handling serving stored documents

@@ -51,11 +52,11 @@ DocumentHandler.prototype.handlePost = function(request, response) {
  var _this = this;
  var buffer = '';
  var cancelled = false;
  request.on('data', function(data) {
    if (!buffer) {
      response.writeHead(200, { 'content-type': 'application/json' });
    }
    buffer += data.toString();

  // What to do when done
  var onSuccess = function () {
    // Check length
    console.log(buffer);
    if (_this.maxLength && buffer.length > _this.maxLength) {
      cancelled = true;
      winston.warn('document >maxLength', { maxLength: _this.maxLength });
@@ -63,14 +64,14 @@ DocumentHandler.prototype.handlePost = function(request, response) {
      response.end(
        JSON.stringify({ message: 'Document exceeds maximum length.' })
      );
      return;
    }
  });
  request.on('end', function(end) {
    if (cancelled) return;
    // And then save if we should
    _this.chooseKey(function (key) {
      _this.store.set(key, buffer, function (res) {
        if (res) {
          winston.verbose('added document', { key: key });
          response.writeHead(200, { 'content-type': 'application/json' });
          response.end(JSON.stringify({ key: key }));
        }
        else {
@@ -80,12 +81,37 @@ DocumentHandler.prototype.handlePost = function(request, response) {
        }
      });
    });
  };

  // If we should, parse a form to grab the data
  var ct = request.headers['content-type'];
  if (ct && ct.split(';')[0] === 'multipart/form-data') {
    var busboy = new Busboy({ headers: request.headers });
    busboy.on('field', function (fieldname, val) {
      if (fieldname === 'data') {
        buffer = val;
      }
    });
    busboy.on('finish', function () {
      onSuccess();
    });
    request.pipe(busboy);
  // Otherwise, use our own and just grab flat data from POST body
  } else {
    request.on('data', function (data) {
      buffer += data.toString();
    });
    request.on('end', function () {
      if (cancelled) { return; }
      onSuccess();
    });
    request.on('error', function (error) {
      winston.error('connection error: ' + error.message);
      response.writeHead(500, { 'content-type': 'application/json' });
      response.end(JSON.stringify({ message: 'Connection error.' }));
      cancelled = true;
    });
  }
};

// Keep choosing keys until one isn't taken
+2 −1
Original line number Diff line number Diff line
@@ -18,7 +18,8 @@
    "connect": "1.9.2",
    "redis-url": "0.1.0",
    "redis": "0.8.1",
    "uglify-js": "1.3.3"
    "uglify-js": "1.3.3",
    "busboy": "0.2.4"
  },
  "devDependencies": {
    "mocha": "*",