From fddd01bbbd82d9c56fae9906cb231d6351a2ce8d Mon Sep 17 00:00:00 2001 From: thisIsTheFoxe Date: Sat, 18 Jan 2020 00:54:03 +0100 Subject: [PATCH 1/6] implemented basic https redirect functionality with a lot of error-logs.. --- bin/http-server | 71 +++++++++++++++++++++++++++++++-------- key.pem | 83 ++++++++++++++++++++++++++++++++++++++++++++++ lib/http-server.js | 27 +++++++++++---- package.json | 4 +++ 4 files changed, 164 insertions(+), 21 deletions(-) create mode 100644 key.pem diff --git a/bin/http-server b/bin/http-server index 7c597fa8a..976087aca 100755 --- a/bin/http-server +++ b/bin/http-server @@ -46,6 +46,7 @@ if (argv.h || argv.help) { '', ' -P --proxy Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com', ' --proxy-options Pass options to proxy using nested dotted objects. e.g.: --proxy-options.secure false', + ' -R --https-redirect Auto redirects http -> https', '', ' --username Username for basic authentication [none]', ' Can also be specified with the env variable NODE_HTTP_SERVER_USERNAME', @@ -73,6 +74,7 @@ var port = argv.p || argv.port || parseInt(process.env.PORT, 10), proxyOptions = argv['proxy-options'], utc = argv.U || argv.utc, version = argv.v || argv.version, + redirect = !!argv.R || !!argv['https-redirect'], logger; var proxyOptionsBooleanProps = [ @@ -125,18 +127,50 @@ if (version) { process.exit(); } -if (!port) { - portfinder.basePort = 8080; - portfinder.getPort(function (err, port) { - if (err) { throw err; } - listen(port); - }); +if (port === true) { + logger.info(colors.red('Error: --port needs a value')); + process.exit(1); + return; } -else { - listen(port); + +if (ssl && redirect) { + var ports = []; + if (!port) { + ports = [8080,443] + } else if (typeof port == "string") { + ports = (port.toString() || "").split(',').map( s => parseInt(s, 10) ); + }else { + logger.info(colors.red('Error: Cannot parse "--port ' + port + '" of type ' + typeof port + '. Port has to be in the format [httpPort,httpsPort]\nExample: --port 8080,443')); + process.exit(1); + } + + if (ports.length == 2) { + if (isNaN(ports[0]) || isNaN(ports[1])) { + logger.info(colors.red('Error parsing "--port ' + port + '". [' + ports + '] is not of type [number,number]')); + process.exit(1); + } + }else { + logger.info(colors.red('Error: Cannot parse "--port ' + port + '"\nExample: --port 8080,443')); + process.exit(1); + } + + listen(ports[1]); + listen(ports[0], ports[1]); +}else if (!ssl && redirect) { + logger.info(colors.red('Error: Can\'t redirect to https when the main server runs on http!')); +}else { + if (!port) { + portfinder.basePort = 8080; + portfinder.getPort(function (err, port) { + if (err) { throw err; } + listen(port); + }); + }else{ + listen(port); + } } -function listen(port) { +function listen(port, redirectPort = null) { var options = { root: argv._[0], cache: argv.c, @@ -150,12 +184,15 @@ function listen(port) { logFn: logger.request, proxy: proxy, proxyOptions: proxyOptions, + httpsPort: redirectPort, showDotfiles: argv.dotfiles, mimetypes: argv.mimetypes, username: argv.username || process.env.NODE_HTTP_SERVER_USERNAME, password: argv.password || process.env.NODE_HTTP_SERVER_PASSWORD }; + var isSSLServer = (ssl && !redirectPort) + if (argv.cors) { options.cors = true; if (typeof argv.cors === 'string') { @@ -173,7 +210,7 @@ function listen(port) { } } - if (tls) { + if (isSSLServer) { options.https = { cert: argv.C || argv.cert || 'cert.pem', key: argv.K || argv.key || 'key.pem', @@ -197,12 +234,14 @@ function listen(port) { var server = httpServer.createServer(options); server.listen(port, host, function () { - var protocol = tls ? 'https://' : 'http://'; + + var protocol = isSSLServer ? 'https://' : 'http://'; logger.info([ - chalk.yellow('Starting up http-server, serving '), - chalk.cyan(server.root), - tls ? (chalk.yellow(' through') + chalk.cyan(' https')) : '' + colors.yellow('Starting up http-server, serving '), + colors.cyan(server.root), + isSSLServer ? (colors.yellow(' through') + colors.cyan(' https')) : '', + colors.yellow('\nAvailable on:') ].join('')); logger.info([chalk.yellow('\nhttp-server version: '), chalk.cyan(require('../package.json').version)].join('')); @@ -242,6 +281,10 @@ function listen(port) { } } + if (redirectPort){ + logger.info("[Redirect listener]") + } + logger.info('Hit CTRL-C to stop the server'); if (argv.o) { const openHost = host === '0.0.0.0' ? '127.0.0.1' : host; diff --git a/key.pem b/key.pem new file mode 100644 index 000000000..75f5e2434 --- /dev/null +++ b/key.pem @@ -0,0 +1,83 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFnDCCA4QCCQDZvIGb2KCmhTANBgkqhkiG9w0BAQUFADCBjzELMAkGA1UEBhMC +REUxGzAZBgNVBAgMEkJhZGVuLVd1ZXJ0dGVtYmVyZzESMBAGA1UEBwwJU3R1dHRn +YXJ0MQ0wCwYDVQQKDARESEJXMQwwCgYDVQQLDANEZXYxEjAQBgNVBAMMCWxvY2Fs +aG9zdDEeMBwGCSqGSIb3DQEJARYPc3RvcmNoOTlAZ214LmRlMB4XDTIwMDExNzEy +MTA1M1oXDTIwMDQxNjEyMTA1M1owgY8xCzAJBgNVBAYTAkRFMRswGQYDVQQIDBJC +YWRlbi1XdWVydHRlbWJlcmcxEjAQBgNVBAcMCVN0dXR0Z2FydDENMAsGA1UECgwE +REhCVzEMMAoGA1UECwwDRGV2MRIwEAYDVQQDDAlsb2NhbGhvc3QxHjAcBgkqhkiG +9w0BCQEWD3N0b3JjaDk5QGdteC5kZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC +AgoCggIBAK2vTWoLeUIUFAQpsJVFlwxWTNBZseWuHBKsEErXQ5eqXrcADv8HM/Nu +oX087s+3TWI46VbzLh1FEXFS8Wn480TLHoFU7ZU4OVjxJOUD5w1h9L0hRMYBsGd3 +FHkCNWhScy9T0742BIAf0vs78yZ5N6CorY8lN30RfZoq2ZdOUZ8Pv4gaLn43Bebw +5qmY195xAl6TY7mxKPvNE0hlV9j/7dDAig+Kk7nruhQKbX0aJh/gXiioFyC+tPFI +ttUjm17AGdjPrUot/7Ms/OzBHvpdZZvOiAvG2PrK+hvRRMMrYii/OVhqK7UsOoc7 +KIiNK36vLkwslj+smGBs+xP43FXEoivgxMv4IlrhBSMKUZnVfJdJ0WMqqSxZQiYp +o8U/HD7O8bM8SNd8ar1X5TthN8ICwQRigrc1NVWdVfGEODrc2jCLlIYMqXNNpvUQ +DwUl+QBqyraFUmJhjQgweu40K2QWyhW7c5uIGw6NZ3F/JUh8fZMLVkBickG7e71o +6eO3FKsILELBhY5XLnUDnQlDwFLo0c6tx9edZY9fJz69OuR1JfgY9JO37Gw+HSRo +Viuo4lc62lQOrl2etpFxoFYLo9hwfyzanATYzreLU/wCt60yTDKtU7HllSGaeBkI +QahYWo/QQgYMTVoseQxJkxFHNczI4zEF4o5VQKXc6n94IP7XImT1AgMBAAEwDQYJ +KoZIhvcNAQEFBQADggIBAAX398LA2bcmXbU7RfgUGLO0U57pb6IwjYBBdkJE0cOd +qudc+CNoful6bM7XshZ6p7+kF2Had63UdChSt1QKqSOF+YRw+h6NwZ6xSaNxGkgI +Xw7b2n1HQT+u+ub6WBu0OaM0quGEYbtwYn9P9UmuCNjYymKGspXNwlRKcL/7It2F +B7XS33we9A39WZibCgZbVtdZUS6CBNlLta6JhJpAR6WC7sV2gaMRP2Nr3ky+uCoi +v1baiqR7HXe4JUUnOB2nJ6pgIIfoCyCNaU/tzGQiprQZSZVndvG17L5GifT81Hsv +mWV52z2rGljiJMnlxkHwa/RD399Rpp/oMRZmlqsZ2sJV8dQxiXKhfTQ9jlIQtf6m +9+s24prPLeKU3p/7rgeChWBX8pjaa8M9dcjXCT1bUKZkRmiqJwxbNDcTBCPqAyCE +RIIDA9MHs58/41x24lwgBCjZcgvFxdunkp3xNn8vw3ONosmB9yfNIEs+hDpV/a+C +PHOSzO8YNJaW18O8rNDbu42td4KhHHp92nagdtnDD+eiTDIOZBL5Lkm/zETZ1M0x +d2jk3D7orTQhKnH9dhugEvV239NuikoDjZXbRF8kJ+gNN5ZW4s9a0CJub9AmElZT +EAC4FVO0KHJJjNjBesNLrBxQKMhy4tl3dl2ydovbs9vGnkSjdCP8qWA6BWNm0buG +-----END CERTIFICATE----- diff --git a/lib/http-server.js b/lib/http-server.js index dfe4c474c..37a2ea66b 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -48,8 +48,8 @@ function HttpServer(options) { this.cache = ( // eslint-disable-next-line no-nested-ternary options.cache === undefined ? 3600 : - // -1 is a special case to turn off caching. - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#Preventing_caching + // -1 is a special case to turn off caching. + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#Preventing_caching options.cache === -1 ? 'no-cache, no-store, must-revalidate' : options.cache // in seconds. ); @@ -68,12 +68,24 @@ function HttpServer(options) { var before = options.before ? options.before.slice() : []; - if (options.logFn) { - before.push(function (req, res) { + before.push(function (req, res) { + if (options.httpsPort) { + var hostname = req.headers.host.match(/:/g) ? req.headers.host.slice(0, req.headers.host.indexOf(':')) : req.headers.host + var httpsUrl = "https://" + hostname + ":" + options.httpsPort + req.url; + res.writeHead(301, { 'Location': httpsUrl }); + res.end(); + + if (options.logFn) { + options.logFn(req, res); + } + return; + } + + if (options.logFn) { options.logFn(req, res); res.emit('next'); - }); - } + } + }); if (options.username || options.password) { before.push(function (req, res) { @@ -150,7 +162,8 @@ function HttpServer(options) { if (options.logFn) { options.logFn(req, res, { message: err.message, - status: res.statusCode }); + status: res.statusCode + }); } res.emit('next'); }); diff --git a/package.json b/package.json index fd7526742..a3dba2d6c 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,10 @@ { "name": "Jade Michael Thornton", "email": "jademichael@jmthornton.net" + }, + { + "name": "Henrik Storch", + "email": "thisisthefoxe@gmail.com" } ], "dependencies": { From 837509be0bac6724ab20bfd33252b04ba87ff715 Mon Sep 17 00:00:00 2001 From: thisIsTheFoxe Date: Sat, 18 Jan 2020 01:06:25 +0100 Subject: [PATCH 2/6] fixed format & lint --- bin/http-server | 38 ++++++++++++++++++++++---------------- lib/http-server.js | 6 +++--- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/bin/http-server b/bin/http-server index 976087aca..454068ea6 100755 --- a/bin/http-server +++ b/bin/http-server @@ -136,41 +136,47 @@ if (port === true) { if (ssl && redirect) { var ports = []; if (!port) { - ports = [8080,443] - } else if (typeof port == "string") { - ports = (port.toString() || "").split(',').map( s => parseInt(s, 10) ); - }else { + ports = [8080,443]; + } + else if (typeof port === 'string') { + ports = (port.toString() || '').split(',').map(function (s) { parseInt(s, 10) }); + } + else { logger.info(colors.red('Error: Cannot parse "--port ' + port + '" of type ' + typeof port + '. Port has to be in the format [httpPort,httpsPort]\nExample: --port 8080,443')); process.exit(1); } - if (ports.length == 2) { - if (isNaN(ports[0]) || isNaN(ports[1])) { + if (ports.length === 2) { + if (isNaN(ports[0]) || isNaN(ports[1])) { logger.info(colors.red('Error parsing "--port ' + port + '". [' + ports + '] is not of type [number,number]')); process.exit(1); - } - }else { + } + } + else { logger.info(colors.red('Error: Cannot parse "--port ' + port + '"\nExample: --port 8080,443')); process.exit(1); } listen(ports[1]); listen(ports[0], ports[1]); -}else if (!ssl && redirect) { +} +else if (!ssl && redirect) { logger.info(colors.red('Error: Can\'t redirect to https when the main server runs on http!')); -}else { +} +else { if (!port) { portfinder.basePort = 8080; portfinder.getPort(function (err, port) { if (err) { throw err; } listen(port); }); - }else{ - listen(port); + } + else { + listen(port); } } -function listen(port, redirectPort = null) { +function listen(port, redirectPort) { var options = { root: argv._[0], cache: argv.c, @@ -191,7 +197,7 @@ function listen(port, redirectPort = null) { password: argv.password || process.env.NODE_HTTP_SERVER_PASSWORD }; - var isSSLServer = (ssl && !redirectPort) + var isSSLServer = (ssl && !redirectPort); if (argv.cors) { options.cors = true; @@ -281,8 +287,8 @@ function listen(port, redirectPort = null) { } } - if (redirectPort){ - logger.info("[Redirect listener]") + if (redirectPort) { + logger.info('[Redirect listener]'); } logger.info('Hit CTRL-C to stop the server'); diff --git a/lib/http-server.js b/lib/http-server.js index 37a2ea66b..5644430ba 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -70,9 +70,9 @@ function HttpServer(options) { before.push(function (req, res) { if (options.httpsPort) { - var hostname = req.headers.host.match(/:/g) ? req.headers.host.slice(0, req.headers.host.indexOf(':')) : req.headers.host - var httpsUrl = "https://" + hostname + ":" + options.httpsPort + req.url; - res.writeHead(301, { 'Location': httpsUrl }); + var hostname = req.headers.host.match(/:/g) ? req.headers.host.slice(0, req.headers.host.indexOf(':')) : req.headers.host; + var httpsUrl = 'https://' + hostname + ':' + options.httpsPort + req.url; + res.writeHead(301, { Location: httpsUrl }); res.end(); if (options.logFn) { From 5c17780a382ad85751e3382cdc7ce07d05a2829e Mon Sep 17 00:00:00 2001 From: thisIsTheFoxe Date: Sat, 18 Jan 2020 01:08:07 +0100 Subject: [PATCH 3/6] removed unneccissary files --- key.pem | 83 --------------------------------------------------------- 1 file changed, 83 deletions(-) delete mode 100644 key.pem diff --git a/key.pem b/key.pem deleted file mode 100644 index 75f5e2434..000000000 --- a/key.pem +++ /dev/null @@ -1,83 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -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 ------END RSA PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIFnDCCA4QCCQDZvIGb2KCmhTANBgkqhkiG9w0BAQUFADCBjzELMAkGA1UEBhMC -REUxGzAZBgNVBAgMEkJhZGVuLVd1ZXJ0dGVtYmVyZzESMBAGA1UEBwwJU3R1dHRn -YXJ0MQ0wCwYDVQQKDARESEJXMQwwCgYDVQQLDANEZXYxEjAQBgNVBAMMCWxvY2Fs -aG9zdDEeMBwGCSqGSIb3DQEJARYPc3RvcmNoOTlAZ214LmRlMB4XDTIwMDExNzEy -MTA1M1oXDTIwMDQxNjEyMTA1M1owgY8xCzAJBgNVBAYTAkRFMRswGQYDVQQIDBJC -YWRlbi1XdWVydHRlbWJlcmcxEjAQBgNVBAcMCVN0dXR0Z2FydDENMAsGA1UECgwE -REhCVzEMMAoGA1UECwwDRGV2MRIwEAYDVQQDDAlsb2NhbGhvc3QxHjAcBgkqhkiG -9w0BCQEWD3N0b3JjaDk5QGdteC5kZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC -AgoCggIBAK2vTWoLeUIUFAQpsJVFlwxWTNBZseWuHBKsEErXQ5eqXrcADv8HM/Nu -oX087s+3TWI46VbzLh1FEXFS8Wn480TLHoFU7ZU4OVjxJOUD5w1h9L0hRMYBsGd3 -FHkCNWhScy9T0742BIAf0vs78yZ5N6CorY8lN30RfZoq2ZdOUZ8Pv4gaLn43Bebw -5qmY195xAl6TY7mxKPvNE0hlV9j/7dDAig+Kk7nruhQKbX0aJh/gXiioFyC+tPFI -ttUjm17AGdjPrUot/7Ms/OzBHvpdZZvOiAvG2PrK+hvRRMMrYii/OVhqK7UsOoc7 -KIiNK36vLkwslj+smGBs+xP43FXEoivgxMv4IlrhBSMKUZnVfJdJ0WMqqSxZQiYp -o8U/HD7O8bM8SNd8ar1X5TthN8ICwQRigrc1NVWdVfGEODrc2jCLlIYMqXNNpvUQ -DwUl+QBqyraFUmJhjQgweu40K2QWyhW7c5uIGw6NZ3F/JUh8fZMLVkBickG7e71o -6eO3FKsILELBhY5XLnUDnQlDwFLo0c6tx9edZY9fJz69OuR1JfgY9JO37Gw+HSRo -Viuo4lc62lQOrl2etpFxoFYLo9hwfyzanATYzreLU/wCt60yTDKtU7HllSGaeBkI -QahYWo/QQgYMTVoseQxJkxFHNczI4zEF4o5VQKXc6n94IP7XImT1AgMBAAEwDQYJ -KoZIhvcNAQEFBQADggIBAAX398LA2bcmXbU7RfgUGLO0U57pb6IwjYBBdkJE0cOd -qudc+CNoful6bM7XshZ6p7+kF2Had63UdChSt1QKqSOF+YRw+h6NwZ6xSaNxGkgI -Xw7b2n1HQT+u+ub6WBu0OaM0quGEYbtwYn9P9UmuCNjYymKGspXNwlRKcL/7It2F -B7XS33we9A39WZibCgZbVtdZUS6CBNlLta6JhJpAR6WC7sV2gaMRP2Nr3ky+uCoi -v1baiqR7HXe4JUUnOB2nJ6pgIIfoCyCNaU/tzGQiprQZSZVndvG17L5GifT81Hsv -mWV52z2rGljiJMnlxkHwa/RD399Rpp/oMRZmlqsZ2sJV8dQxiXKhfTQ9jlIQtf6m -9+s24prPLeKU3p/7rgeChWBX8pjaa8M9dcjXCT1bUKZkRmiqJwxbNDcTBCPqAyCE -RIIDA9MHs58/41x24lwgBCjZcgvFxdunkp3xNn8vw3ONosmB9yfNIEs+hDpV/a+C -PHOSzO8YNJaW18O8rNDbu42td4KhHHp92nagdtnDD+eiTDIOZBL5Lkm/zETZ1M0x -d2jk3D7orTQhKnH9dhugEvV239NuikoDjZXbRF8kJ+gNN5ZW4s9a0CJub9AmElZT -EAC4FVO0KHJJjNjBesNLrBxQKMhy4tl3dl2ydovbs9vGnkSjdCP8qWA6BWNm0buG ------END CERTIFICATE----- From 07a79edf0092692cd04a85eef432b7a85e60edc0 Mon Sep 17 00:00:00 2001 From: thisIsTheFoxe Date: Sat, 18 Jan 2020 01:12:55 +0100 Subject: [PATCH 4/6] updated --help descriptions --- bin/http-server | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/http-server b/bin/http-server index 454068ea6..2d136a902 100755 --- a/bin/http-server +++ b/bin/http-server @@ -24,7 +24,7 @@ if (argv.h || argv.help) { 'usage: http-server [path] [options]', '', 'options:', - ' -p --port Port to use. If 0, look for open port. [8080]', + ' -p --port Port to use. If 0, look for open port. [8080]. If --https-redirect, http and (main) https port [8080,443]', ' -a Address to use [0.0.0.0]', ' -d Show directory listings [true]', ' -i Display autoIndex [true]', @@ -44,9 +44,9 @@ if (argv.h || argv.help) { ' -U --utc Use UTC time format in log messages.', ' --log-ip Enable logging of the client\'s IP address', '', - ' -P --proxy Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com', - ' --proxy-options Pass options to proxy using nested dotted objects. e.g.: --proxy-options.secure false', - ' -R --https-redirect Auto redirects http -> https', + ' -P --proxy Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com', + ' --proxy-options Pass options to proxy using nested dotted objects. e.g.: --proxy-options.secure false', + ' -R --https-redirect Auto redirects http -> https', '', ' --username Username for basic authentication [none]', ' Can also be specified with the env variable NODE_HTTP_SERVER_USERNAME', From 4dd6bde3bf17a55937962394fd7443c62b5c2648 Mon Sep 17 00:00:00 2001 From: thisIsTheFoxe Date: Mon, 30 Mar 2020 15:16:10 +0200 Subject: [PATCH 5/6] resolve conflicts coming from PR #586; (small optimizations) --- lib/http-server.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/http-server.js b/lib/http-server.js index 5644430ba..8d9cdf66e 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -68,24 +68,21 @@ function HttpServer(options) { var before = options.before ? options.before.slice() : []; - before.push(function (req, res) { - if (options.httpsPort) { + if (options.httpsPort) { + before.push(function (req, res) { var hostname = req.headers.host.match(/:/g) ? req.headers.host.slice(0, req.headers.host.indexOf(':')) : req.headers.host; var httpsUrl = 'https://' + hostname + ':' + options.httpsPort + req.url; res.writeHead(301, { Location: httpsUrl }); res.end(); + }); + } - if (options.logFn) { - options.logFn(req, res); - } - return; - } - - if (options.logFn) { + if (options.logFn) { + before.push(function (req, res) { options.logFn(req, res); res.emit('next'); - } - }); + }); + } if (options.username || options.password) { before.push(function (req, res) { From 696e8bef026c0beaab9ab0b9a415884d8c4f7403 Mon Sep 17 00:00:00 2001 From: Henrik Storch Date: Tue, 11 Jan 2022 17:17:08 +0100 Subject: [PATCH 6/6] Fix conflicts for --https-redirect --- bin/http-server | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/bin/http-server b/bin/http-server index 2d136a902..2b2e15f5c 100755 --- a/bin/http-server +++ b/bin/http-server @@ -1,7 +1,6 @@ #!/usr/bin/env node 'use strict'; - var chalk = require('chalk'), os = require('os'), httpServer = require('../lib/http-server'), @@ -53,9 +52,9 @@ if (argv.h || argv.help) { ' --password Password for basic authentication [none]', ' Can also be specified with the env variable NODE_HTTP_SERVER_PASSWORD', '', - ' -S --tls --ssl Enable secure request serving with TLS/SSL (HTTPS)', - ' -C --cert Path to TLS cert file (default: cert.pem)', - ' -K --key Path to TLS key file (default: key.pem)', + ' -S --tls --ssl Enable secure request serving with TLS/SSL (HTTPS)', + ' -C --cert Path to TLS cert file (default: cert.pem)', + ' -K --key Path to TLS key file (default: key.pem)', '', ' -r --robots Respond to /robots.txt [User-agent: *\\nDisallow: /]', ' --no-dotfiles Do not show dotfiles', @@ -74,7 +73,7 @@ var port = argv.p || argv.port || parseInt(process.env.PORT, 10), proxyOptions = argv['proxy-options'], utc = argv.U || argv.utc, version = argv.v || argv.version, - redirect = !!argv.R || !!argv['https-redirect'], + redirect = !!argv.R || !!argv['https-redirect'], logger; var proxyOptionsBooleanProps = [ @@ -128,40 +127,40 @@ if (version) { } if (port === true) { - logger.info(colors.red('Error: --port needs a value')); + logger.info(chalk.red('Error: --port needs a value')); process.exit(1); return; } -if (ssl && redirect) { +if (tls && redirect) { var ports = []; if (!port) { ports = [8080,443]; } else if (typeof port === 'string') { - ports = (port.toString() || '').split(',').map(function (s) { parseInt(s, 10) }); + ports = (port.toString() || '').split(',').map(function (s) { return parseInt(s, 10) }); } else { - logger.info(colors.red('Error: Cannot parse "--port ' + port + '" of type ' + typeof port + '. Port has to be in the format [httpPort,httpsPort]\nExample: --port 8080,443')); + logger.info(chalk.red('Error: Cannot parse "--port ' + port + '" of type ' + typeof port + '. Port has to be in the format [httpPort,httpsPort]\nExample: --port 8080,443')); process.exit(1); } if (ports.length === 2) { - if (isNaN(ports[0]) || isNaN(ports[1])) { - logger.info(colors.red('Error parsing "--port ' + port + '". [' + ports + '] is not of type [number,number]')); + if (isNaN(ports[0]) || isNaN(ports[1])) { + logger.info(chalk.red('Error parsing "--port ' + port + '". [' + ports + '] is not of type [number,number]')); process.exit(1); } } else { - logger.info(colors.red('Error: Cannot parse "--port ' + port + '"\nExample: --port 8080,443')); + logger.info(chalk.red('Error: Cannot parse "--port ' + port + '"\nExample: --port 8080,443')); process.exit(1); } listen(ports[1]); listen(ports[0], ports[1]); } -else if (!ssl && redirect) { - logger.info(colors.red('Error: Can\'t redirect to https when the main server runs on http!')); +else if (!tls && redirect) { + logger.info(chalk.red('Error: Can\'t redirect to https when the main server runs on http!')); } else { if (!port) { @@ -197,7 +196,7 @@ function listen(port, redirectPort) { password: argv.password || process.env.NODE_HTTP_SERVER_PASSWORD }; - var isSSLServer = (ssl && !redirectPort); + var isTLSServer = (tls && !redirectPort); if (argv.cors) { options.cors = true; @@ -216,7 +215,7 @@ function listen(port, redirectPort) { } } - if (isSSLServer) { + if (isTLSServer) { options.https = { cert: argv.C || argv.cert || 'cert.pem', key: argv.K || argv.key || 'key.pem', @@ -241,13 +240,13 @@ function listen(port, redirectPort) { var server = httpServer.createServer(options); server.listen(port, host, function () { - var protocol = isSSLServer ? 'https://' : 'http://'; + var protocol = isTLSServer ? 'https://' : 'http://'; logger.info([ - colors.yellow('Starting up http-server, serving '), - colors.cyan(server.root), - isSSLServer ? (colors.yellow(' through') + colors.cyan(' https')) : '', - colors.yellow('\nAvailable on:') + chalk.yellow('Starting up http-server, serving '), + chalk.cyan(server.root), + isTLSServer ? (chalk.yellow(' through') + chalk.cyan(' https')) : '', + chalk.yellow('\nAvailable on:') ].join('')); logger.info([chalk.yellow('\nhttp-server version: '), chalk.cyan(require('../package.json').version)].join(''));