From 0285f9b40f39af77c4cc853bb4ec355ff3bdd95c Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Thu, 16 Aug 2018 20:45:31 -0600 Subject: [PATCH] WIP cleanup --- index.js | 154 +++++++++++++++++++++++++++------------------------ package.json | 4 +- 2 files changed, 83 insertions(+), 75 deletions(-) diff --git a/index.js b/index.js index c3b27be..1b6f0d0 100644 --- a/index.js +++ b/index.js @@ -10,7 +10,85 @@ try { // opts.approveDomains(options, certs, cb) module.exports.create = function (opts) { // accept all defaults for greenlock.challenges, greenlock.store, greenlock.middleware - opts._communityPackage = opts._communityPackage || 'greenlock-express.js'; + if (!opts._communityPackage) { + opts._communityPackage = 'greenlock-express.js'; + } + + function explainError(e) { + console.error('Error:' + e.message); + if ('EACCES' === e.errno) { + console.error("You don't have prmission to access '" + e.address + ":" + e.port + "'."); + console.error("You probably need to use \"sudo\" or \"sudo setcap 'cap_net_bind_service=+ep' $(which node)\""); + return; + } + if ('EADDRINUSE' === e.errno) { + console.error("'" + e.address + ":" + e.port + "' is already being used by some other program."); + console.error("You probably need to stop that program or restart your computer."); + return; + } + console.error(e.code + ": '" + e.address + ":" + e.port + "'"); + } + + function _listenHttp(plainPort) { + if (!plainPort) { plainPort = 80; } + var p = plainPort; + var validHttpPort = (parseInt(p, 10) >= 0); + if (!validHttpPort) { console.warn("'" + p + "' doesn't seem to be a valid port number for http"); } + var plainServer = require('http').createServer( + greenlock.middleware.sanitizeHost(greenlock.middleware(require('redirect-https')())) + ); + var promise = new PromiseA(function (resolve) { + plainServer.listen(p, function () { + console.log("Success! Bound to port '" + p + "' to handle ACME challenges and redirect to https"); + resolve(); + }).on('error', function (e) { + console.log("Did not successfully create http server and bind to port '" + p + "':"); + explainError(e); + process.exit(0); + }); + }); + promise.server = plainServer; + return promise; + } + + function _listenHttps(port) { + if (!port) { port = 443; } + + var p = port; + var validHttpsPort = (parseInt(p, 10) >= 0); + if (!validHttpsPort) { console.warn("'" + p + "' doesn't seem to be a valid port number for https"); } + var https; + try { + https = require('spdy'); + greenlock.tlsOptions.spdy = { protocols: [ 'h2', 'http/1.1' ], plain: false }; + } catch(e) { + https = require('https'); + } + var server = https.createServer( + greenlock.tlsOptions + , greenlock.middleware.sanitizeHost(function (req, res) { + try { + greenlock.app(req, res); + } catch(e) { + console.error("[error] [greenlock.app] Your HTTP handler had an uncaught error:"); + console.error(e); + } + }) + ); + var promise = new PromiseA(function (resolve) { + server.listen(p, function () { + console.log("Success! Serving https on port '" + p + "'"); + resolve(server); + }).on('error', function (e) { + console.log("Did not successfully create https server and bind to port '" + p + "':"); + explainError(e); + process.exit(0); + }); + }); + promise.server = server; + return promise; + } + var greenlock = require('greenlock').create(opts); opts.app = opts.app || function (req, res) { @@ -19,78 +97,8 @@ module.exports.create = function (opts) { opts.listen = function (plainPort, port) { var promises = []; - var plainPorts = plainPort; - var ports = port; - var servers = []; - - function explainError(e) { - console.error('Error:' + e.message); - if ('EACCES' === e.errno) { - console.error("You don't have prmission to access '" + e.address + ":" + e.port + "'."); - console.error("You probably need to use \"sudo\" or \"sudo setcap 'cap_net_bind_service=+ep' $(which node)\""); - return; - } - if ('EADDRINUSE' === e.errno) { - console.error("'" + e.address + ":" + e.port + "' is already being used by some other program."); - console.error("You probably need to stop that program or restart your computer."); - return; - } - console.error(e.code + ": '" + e.address + ":" + e.port + "'"); - } - - if (!plainPorts) { - plainPorts = 80; - } - if (!ports) { - ports = 443; - } - - if (!Array.isArray(plainPorts)) { - plainPorts = [ plainPorts ]; - ports = [ ports ]; - } - - plainPorts.forEach(function (p) { - if (!(parseInt(p, 10) >= 0)) { console.warn("'" + p + "' doesn't seem to be a valid port number for http"); } - promises.push(new PromiseA(function (resolve) { - require('http').createServer(greenlock.middleware(require('redirect-https')())).listen(p, function () { - console.log("Success! Bound to port '" + p + "' to handle ACME challenges and redirect to https"); - resolve(); - }).on('error', function (e) { - console.log("Did not successfully create http server and bind to port '" + p + "':"); - explainError(e); - process.exit(0); - }); - })); - }); - - ports.forEach(function (p) { - if (!(parseInt(p, 10) >= 0)) { console.warn("'" + p + "' doesn't seem to be a valid port number for https"); } - promises.push(new PromiseA(function (resolve) { - var https; - try { - https = require('spdy'); - greenlock.tlsOptions.spdy = { protocols: [ 'h2', 'http/1.1' ], plain: false }; - } catch(e) { - https = require('https'); - } - var server = https.createServer(greenlock.tlsOptions, greenlock.middleware(greenlock.app)).listen(p, function () { - console.log("Success! Serving https on port '" + p + "'"); - resolve(); - }).on('error', function (e) { - console.log("Did not successfully create https server and bind to port '" + p + "':"); - explainError(e); - process.exit(0); - }); - servers.push(server); - })); - }); - - if (!Array.isArray(port)) { - servers = servers[0]; - } - - return servers; + promises.push(_listenHttp(plainPort)); + promises.push(_listenHttps(port)); }; diff --git a/package.json b/package.json index 78c8ab7..309c60b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "greenlock-express", - "version": "2.3.2", + "version": "2.3.3", "description": "Free SSL and managed or automatic HTTPS for node.js with Express, Koa, Connect, Hapi, and all other middleware systems.", "main": "index.js", "homepage": "https://git.coolaj86.com/coolaj86/greenlock-express.js", @@ -8,7 +8,7 @@ "example": "examples" }, "dependencies": { - "greenlock": "^2.3.7", + "greenlock": "^2.3.10", "le-challenge-fs": "^2.0.8", "le-sni-auto": "^2.1.4", "le-store-certbot": "^2.1.0",