diff --git a/bin/http-server b/bin/http-server index 71e4e1ff..74cafda9 100755 --- a/bin/http-server +++ b/bin/http-server @@ -50,6 +50,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', + ' --websocket Enable websocket proxy', '', ' --username Username for basic authentication [none]', ' Can also be specified with the env variable NODE_HTTP_SERVER_USERNAME', @@ -75,6 +76,7 @@ var port = argv.p || argv.port || parseInt(process.env.PORT, 10), sslPassphrase = process.env.NODE_HTTP_SERVER_SSL_PASSPHRASE, proxy = argv.P || argv.proxy, proxyOptions = argv['proxy-options'], + websocket = argv.websocket, utc = argv.U || argv.utc, version = argv.v || argv.version, logger; @@ -170,6 +172,14 @@ function listen(port) { } } + if (websocket) { + if (!proxy) { + logger.warning(colors.yellow('WebSocket proxy will not be enabled because proxy is not enabled')); + } else { + options.websocket = true; + } + } + if (argv.cors) { options.cors = true; if (typeof argv.cors === 'string') { diff --git a/lib/http-server.js b/lib/http-server.js index dfe4c474..023d65d1 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -141,12 +141,13 @@ function HttpServer(options) { if (typeof options.proxy === 'string') { var proxyOptions = options.proxyOptions || {}; - var proxy = httpProxy.createProxyServer(proxyOptions); + var proxy = httpProxy.createProxyServer({ + ...proxyOptions, + target: options.proxy, + changeOrigin: true, + }); before.push(function (req, res) { - proxy.web(req, res, { - target: options.proxy, - changeOrigin: true - }, function (err, req, res) { + proxy.web(req, res, {}, function (err, req, res) { if (options.logFn) { options.logFn(req, res, { message: err.message, @@ -177,6 +178,11 @@ function HttpServer(options) { // if passphrase is set, shim must be used as union does not support ? require('./shims/https-server-shim')(serverOptions) : union.createServer(serverOptions); + if (proxy && options.websocket) { + this.server.on('upgrade', function (request, socket, head) { + proxy.ws(request, socket, head); + }); + } if (options.timeout !== undefined) { this.server.setTimeout(options.timeout);