From 6689dcbf98debdf87a3b05370cf6519352edd5e1 Mon Sep 17 00:00:00 2001 From: avwo Date: Sun, 22 Oct 2017 20:50:25 +0800 Subject: [PATCH] feat: Handle upgrade event --- biz/webui/cgi-bin/composer.js | 3 +++ lib/https/index.js | 2 +- lib/upgrade.js | 26 +++++++++++++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/biz/webui/cgi-bin/composer.js b/biz/webui/cgi-bin/composer.js index 244ac66a9..9f2e8d637 100644 --- a/biz/webui/cgi-bin/composer.js +++ b/biz/webui/cgi-bin/composer.js @@ -69,6 +69,9 @@ function getReqRaw(options) { } function handleWebSocket(options) { + if (options.protocol === 'https:' || options.protocol === 'wss:') { + options.headers[config.HTTPS_FIELD] = 1; + } var socket = net.connect(config.port, function() { socket.write(getReqRaw(options)); }); diff --git a/lib/https/index.js b/lib/https/index.js index 3203b6cf8..2cac53c85 100644 --- a/lib/https/index.js +++ b/lib/https/index.js @@ -414,6 +414,6 @@ module.exports = function dispatch(socket, hostname, _proxy, callback) { } }; - +module.exports.handleWebsocket = handleWebsocket; diff --git a/lib/upgrade.js b/lib/upgrade.js index 9bd088341..5a2cc625f 100644 --- a/lib/upgrade.js +++ b/lib/upgrade.js @@ -1,6 +1,30 @@ +var crypto = require('crypto'); +var handleWebsocket = require('./https').handleWebsocket; + function upgradeHandler(req, socket) { - console.log(req.headers); + var reqSocket; + var destroyed; + function destroy(err) { + if (destroyed) { + return; + } + destroyed = true; + socket.destroy(err); + reqSocket && reqSocket.destroy(); + } + socket.on('error', destroy); + socket.headers = req.headers; + socket.rawHeaders = req.rawHeaders; + req.headers['sec-websocket-version'] = 13; + req.headers['sec-websocket-key'] = crypto.randomBytes(16).toString('base64'); + handleWebsocket(socket, null, null, function(err, svrSocket) { + reqSocket = svrSocket; + if (err) { + return destroy(err); + } + svrSocket.on('error', destroy); + }); } module.exports = function(server, proxy) {