2

I'm trying to create simple https server with websockets support. I had some functional code for https server and websockets, but both standalone. Don't know how to combine it. I prefer to use free to use libraries (MIT,..)

I want to be able to serve http request and also websockets.

Https example with upgrade, but don't know how to handle upgraded websocket connection as my second example bellow this.

connection. process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

var https = require('https');
var websocket = require('websocket');
var fs = require('fs');

var options = {
    key:fs.readFileSync('./cert/server.key'),
    cert:fs.readFileSync('./cert/server.crt')
};

var server = https.createServer(
    options
  , function(req,res) {

    console.log('req');

    res.writeHeader(200, { 'Content-Type': 'text/plain' });
    res.write('test');
    res.end();
  }
);
server.on('upgrade', (req, socket, head) => {

    console.log('upgrade ');

  socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
               'Upgrade: WebSocket\r\n' +
               'Connection: Upgrade\r\n' +
               '\r\n');

  socket.pipe(socket);
});

server.listen(8080, '127.0.0.1', () => {

  // make a request
  const options = {
    port: 8080,
    hostname: '127.0.0.1',
    headers: {
      'Connection': 'Upgrade',
      'Upgrade': 'websocket'
    }
  };

  const req = https.request(options);
  req.end();

  req.on('upgrade', (res, socket, upgradeHead) => {

    console.log('got upgraded!');

*** so what to do here ***


    /*
    socket.end();
    process.exit(0);
    */
  });
});

This is functional websockets but without possibility to handle simple http(s) requests.

var https = require('https');
var ws = require('websocket').server;
var fs = require('fs');

var options = {
    key:fs.readFileSync('./cert/server.key'),
    cert:fs.readFileSync('./cert/server.crt')
};


var server = https.createServer(
        options
, function(req,res) {
        res.writeHeader(200);
        res.end();
}
);

server.listen(8080);


var wss = new ws({httpServer:server});

var connectionNumber=0;
console.log('start ');
wss.on('request',function(req){

        req.on('requestAccepted',function(conn){

                conn.on('message',function(msg){

                        conn.send('test');
                });

                conn.on('close',function(msg){
                });

        });

        req.accept(null,req.origin);
});

I was looking for functional example of combined solution but haven't any luck.

Adam
  • 120
  • 2
  • 12

2 Answers2

4

You can to have wss-connection trouble with self-signed certificate (code 1006). In this case you must add your certificate to root CA (Firefox, Chrome).

// app.js
'use strict'
const https = require('https');
const fs = require('fs');
const ws = require('ws');

const options = {
  key: fs.readFileSync('key.pem'),
  cert: fs.readFileSync('cert.pem')
};

const index = fs.readFileSync('./index.html');

let server = https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end(index);
});
server.addListener('upgrade', (req, res, head) => console.log('UPGRADE:', req.url));
server.on('error', (err) => console.error(err));
server.listen(8000, () => console.log('Https running on port 8000'));

const wss = new ws.Server({server, path: '/echo'});
wss.on('connection', function connection(ws) {
    ws.send('Hello');   
    ws.on('message', (data) => ws.send('Receive: ' + data));
});

// index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
</head>
<body>
<script>
    var socket = new WebSocket('wss://127.0.0.1:8000/echo');
    socket.onopen = () => console.log('Connected') || setInterval(() => socket.send(new Date().toLocaleString()), 1000);    
    socket.onclose = (event) =>  console.log((event.wasClean) ? 'Disconnected' :  'Connection break: ' + (event.reason || event.code)); 
    socket.onmessage = (event) => console.log('DATA', event.data);
    socket.onerror = (err) => console.error(err.message);
</script>
Press F12 to open console...
</body>
</html>
Aikon Mogwai
  • 3,990
  • 2
  • 11
  • 22
0

Since you are using Node, I suggest taking a look at Socket.io. It is easier to use than doing all the manual websocket connection logic yourself.

Retro Gamer
  • 928
  • 7
  • 21