'use strict';

/**
 * This plugin accumulates data chunks from the client into an array
 * property on the request, concats them on end and delivers the entire
 * accumulated request data as one big chunk to the next plugin in the
 * sequence. Since this plugin operates on requests, it should be the
 * first plugin in the sequence so that subsequent plugins receive the
 * accumulated request data.
 *
 * Users should be aware that buffering large requests or responses in
 * memory can cause Apigee Edge Microgateway to run out of memory under
 * high load or with a large number of concurrent requests. So this plugin
 * should only be used when it is known that request/response bodies are small.
 */
module.exports.init = function(config, logger, stats) {

  function accumulate(req, data) {
    if (!req._chunks) req._chunks = [];
    req._chunks.push(data);
  }

  return {

    ondata_request: function(req, res, data, next) {
      if (data && data.length > 0) accumulate(req, data);
      next(null, null);
    },

    onend_request: function(req, res, data, next) {
      if (data && data.length > 0) accumulate(req, data);
      var content = Buffer.concat(req._chunks);
      delete req._chunks;
      next(null, content);
    }

  };

}
