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);