Ws: After handleUpgrade server crashes

Created on 15 Mar 2019  路  3Comments  路  Source: websockets/ws

Description

When trying to manually upgrade connection using code:

server.on('upgrade', function(request, socket, head){
  wss.handleUpgrade(request, socket, head, function(websocket){
    console.log("new websocket");
  });
});

server crashes with error

Reproducible in:

  • version: 6.2.0
  • Node.js version(s): v10 and v11
  • OS version(s): Linux

Steps to reproduce:

  1. Run server
const http = require('http');
const ws = require('ws');

var port;
port = 3311;
var server = http.createServer();
var wss = new ws.Server({
  server: server,
  noServer: true
});

server.on('upgrade', function(request, socket, head){
  wss.handleUpgrade(request, socket, head, function(websocket){
    console.log("new websocket");
  });
});

server.listen(port);

2.
run client with script

var socket = new WebSocket('ws://localhost:3311')

Expected result:

No crash connection established

Actual result:

server crashes with this error when firefox clients connects:

 websocket.readyState = WebSocket.CLOSING;
                       ^

TypeError: Cannot set property 'readyState' of undefined
    at Socket.socketOnClose (/home/bartek/Projekty/ehelon/discovery/node_modules/ws/lib/websocket.js:829:24)
    at Socket.emit (events.js:202:15)
    at TCP._handle.close (net.js:611:12)

and with this when chrome is connecting

events.js:173
      throw er; // Unhandled 'error' event
      ^

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at writeAfterEnd (_stream_writable.js:248:12)
    at Receiver.Writable.write (_stream_writable.js:296:5)
    at Socket.socketOnData (/home/bartek/Projekty/ehelon/discovery/node_modules/ws/lib/websocket.js:867:35)
    at Socket.emit (events.js:202:15)
    at addChunk (_stream_readable.js:288:12)
    at readableAddChunk (_stream_readable.js:269:11)
    at Socket.Readable.push (_stream_readable.js:224:10)
    at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:145:17)
Emitted 'error' event at:
    at Receiver.receiverOnError (/home/bartek/Projekty/ehelon/discovery/node_modules/ws/lib/websocket.js:772:13)
    at Receiver.emit (events.js:197:13)
    at errorOrDestroy (internal/streams/destroy.js:98:12)
    at writeAfterEnd (_stream_writable.js:250:3)
    at Receiver.Writable.write (_stream_writable.js:296:5)
    [... lines matching original stack trace ...]
    at Socket.Readable.push (_stream_readable.js:224:10)

Most helpful comment

var wss = new ws.Server({
  server: server,
  noServer: true
});

This is wrong. Use only noServer.

All 3 comments

var wss = new ws.Server({
  server: server,
  noServer: true
});

This is wrong. Use only noServer.

Thank it worked! :smiley:

```js
var wss = new ws.Server({
  server: server,
  noServer: true
});

This is wrong. Use only noServer.
```

Love you. Do you think it is secure for production servers?
I use nginx for websockets.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

brainkim picture brainkim  路  4Comments

binarykitchen picture binarykitchen  路  5Comments

robertmylne picture robertmylne  路  3Comments

dcflow picture dcflow  路  4Comments

nabeelio picture nabeelio  路  5Comments