'use strict'; var NOBJ = {}; module.exports.create = function (challenge) { var servers = { _servers: [] , httpResponder: function (req, res) { console.info(req.method + ' ' + req.headers.host + req.url); var acmeChallengePrefix = '/.well-known/acme-challenge/'; if (0 !== req.url.indexOf(acmeChallengePrefix)) { res.end("Greenlockā„¢ Commandline: https://git.coolaj86.com/coolaj86/greenlock-cli.js"); return; } var token = req.url.slice(acmeChallengePrefix.length); challenge.get(NOBJ, req.headers.host.replace(/:.*/, ''), token, function (err, val) { if (val) { console.info("Responding with authorization token '" + val + "'"); } else { console.info("No authorization token found"); } res.end(val || '_ ERROR challenge not found _'); }); } , startServers: function (plainPorts, tlsPorts, opts) { opts = opts || {}; var tlsOptions = opts.tlsOptions || {}; var https = require('https'); var http = require('http'); if (servers._servers.length) { return; } // http-01-port plainPorts.forEach(function (port) { var server = http.createServer(servers.httpResponder); servers._servers.push(server); server.listen(port, function () { if (opts.debug) { console.info('Listening http on', this.address()); } }); server.on('error', function (err) { if ('EADDRINUSE' === err.code) { console.error(""); console.error("You already have a different server running on port '" + port + "'."); console.error("You should probably use the --webroot-path option instead of --standalone."); return; } throw err; }); }); // tls-sni-01-port tlsPorts.forEach(function (port) { var server = https.createServer(tlsOptions, servers.httpResponder); servers._servers.push(server); server.listen(port, function () { if (opts.debug) { console.info('Listening https on', this.address()); } }); server.on('error', function (err) { if ('EADDRINUSE' === err.code) { console.error(""); console.error("You already have a different server running on port '" + port + "'."); console.error("You should probably use the --webroot-path option instead of --standalone."); return; } throw err; }); }); } , closeServers: function (opts) { opts = opts || {}; return new Promise(function (done) { var closedServers = 0; var serversToClose = servers._servers.length; if (0 === serversToClose) { done(); } servers._servers.forEach(function (server) { server.close(function () { if (serversToClose === ++closedServers) { if (opts.debug) { console.info('Closed all servers'); } servers._servers = []; done(); } }); }); }); } }; return servers; };