/*
 * Copyright (c) 2014, Tidepool Project
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice, this
 * list of conditions and the following disclaimer in the documentation and/or other
 * materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

var config = require('./lib/common/config.js');
var except = require('./lib/common/except.js');

module.exports = (function(){
  var env = {};

  // The port to attach an HTTP listener, if null, no HTTP listener will be attached
  env.httpPort = config.fromEnvironment('HTTP_PORT', null);

  // The port to attach an HTTPS listener, if null, no HTTPS listener will be attached
  env.httpsPort = config.fromEnvironment('HTTPS_PORT', null);

  // The https config to pass along to https.createServer.
  var theConfig = config.fromEnvironment('HTTPS_CONFIG', null);
  env.httpsConfig = null;
  if (theConfig != null) {
    env.httpsConfig = JSON.parse(theConfig);
  }
  if (env.httpsPort != null && env.httpsConfig == null) {
    throw except.ISE('No https config provided, please set HTTPS_CONFIG with at least the certificate to use.');
  }

  // A JSON object of domain -> JSON Array of rules.  Domains ignore case and must be exact.
  // The domain "*" is a catchall for everything that didn't match a specific domain.
  //
  // The rules are applied by first taking the value of the Host: header, looking up the correct
  // set of rules for the specific host and then running through the rules until it finds a rule
  // that covers the request.  The request is then completely delegated to that rule.
  env.rules = JSON.parse(config.fromEnvironment('RULES'));

  return env;
})();
@@ -1361,16 +1361,41 @@
 E.%0A */%0A%0A
+var fs = require('fs');%0A%0A
 var conf
@@ -1483,16 +1483,234 @@
 .js');%0A%0A
+function maybeReplaceWithContentsOfFile(obj, field)%0A%7B%0A  var potentialFile = obj%5Bfield%5D;%0A  if (potentialFile != null && fs.existsSync(potentialFile)) %7B%0A    obj%5Bfield%5D = fs.readFileSync(potentialFile).toString();%0A  %7D%0A%7D%0A%0A
 module.e
@@ -2265,16 +2265,197 @@
 onfig);%0A
+    maybeReplaceWithContentsOfFile(env.httpsConfig, 'key');%0A    maybeReplaceWithContentsOfFile(env.httpsConfig, 'cert');%0A    maybeReplaceWithContentsOfFile(env.httpsConfig, 'pfx');%0A
   %7D%0A  if
@@ -2626,16 +2626,17 @@
 );%0A  %7D%0A%0A
+%0A
   // A J

Load up key/cert files automatically if defined as files.