diff --git a/lib/servers/WebsocketServer.js b/lib/servers/WebsocketServer.js index 21bfb0c344..8424b6d382 100644 --- a/lib/servers/WebsocketServer.js +++ b/lib/servers/WebsocketServer.js @@ -10,10 +10,20 @@ module.exports = class WebsocketServer extends BaseServer { constructor(server) { super(server); this.wsServer = new ws.Server({ - server: this.server.listeningApp, + noServer: true, path: this.server.sockPath, }); + this.server.listeningApp.on('upgrade', (req, sock, head) => { + if (!this.wsServer.shouldHandle(req)) { + return; + } + + this.wsServer.handleUpgrade(req, sock, head, (connection) => { + this.wsServer.emit('connection', connection, req); + }); + }); + this.wsServer.on('error', (err) => { this.server.log.error(err.message); }); diff --git a/test/server/proxy-option.test.js b/test/server/proxy-option.test.js index 6f21967248..49368d3627 100644 --- a/test/server/proxy-option.test.js +++ b/test/server/proxy-option.test.js @@ -257,49 +257,55 @@ describe('proxy option', () => { let wsServer; let responseMessage; - beforeAll((done) => { - testServer.start( - config, - { - contentBase, - proxy: [ + const transportModes = ['sockjs', 'ws']; + transportModes.forEach((transportMode) => { + describe(`with transportMode: ${transportMode}`, () => { + beforeAll((done) => { + testServer.start( + config, { - context: '/', - target: `http://localhost:${port4}`, - ws: true, + contentBase, + transportMode, + proxy: [ + { + context: '/', + target: `http://localhost:${port4}`, + ws: true, + }, + ], + port: port3, }, - ], - port: port3, - }, - done - ); - - wsServer = new WebSocketServer({ port: port4 }); - wsServer.on('connection', (server) => { - server.on('message', (message) => { - server.send(message); + done + ); + + wsServer = new WebSocketServer({ port: port4 }); + wsServer.on('connection', (server) => { + server.on('message', (message) => { + server.send(message); + }); + }); }); - }); - }); - beforeEach((done) => { - ws = new WebSocket(`ws://localhost:${port3}/proxy3/socket`); - ws.on('message', (message) => { - responseMessage = message; - done(); - }); - ws.on('open', () => { - ws.send('foo'); - }); - }); + beforeEach((done) => { + ws = new WebSocket(`ws://localhost:${port3}/proxy3/socket`); + ws.on('message', (message) => { + responseMessage = message; + done(); + }); + ws.on('open', () => { + ws.send('foo'); + }); + }); - it('Should receive response', () => { - expect(responseMessage).toEqual('foo'); - }); + it('Should receive response', () => { + expect(responseMessage).toEqual('foo'); + }); - afterAll((done) => { - wsServer.close(); - testServer.close(done); + afterAll((done) => { + wsServer.close(); + testServer.close(done); + }); + }); }); });