Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
http://address:port/socket.ioв socket.io клиент стучится на http://address:port/socket.iovar ws = new Websocket('http://address:port/');
var ws = new Websocket('ws://address:port/);
var ws = new Websocket('wss://address:port/');
на момент апгрейда протокола, безопасное соединение уже установлено
https://127.0.0.1/ и стучусь в wss://127.0.0.1/wss/, то в бэкенде код прокси видаvar proxy = httpProxy.createProxyServer({});
http.createServer(function(req, res) {
var hostname = req.headers.host.split(":")[0];
var pathname = url.parse(req.url).pathname;
var options = {};
if (pathname == '/wss/') {
options.target = 'ws://' + httpHost + ':' + wsPort + '/';
options.ws = true;
proxy.ws(req, res, options);
} else {
options.target = 'http://' + httpHost + ':' + httpPort + '/';
proxy.web(req, res, options);
}
}).listen(proxyPort);
GET /demo HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Key2: 4 @1 46546xW%0l 1 5
Host: example.com
Sec-WebSocket-Key1: 12998 5 Y3 1 .P00
Origin: http://example.com
WebSocket-Protocol: sample
Event: 'upgrade'#
function (request, socket, head) { }
Emitted each time a client requests a http upgrade. If this event isn't listened for, then clients requesting an upgrade will have their connections closed.
var
http = require('https'),
https = require('https'),
url = require('url'),
httpProxy = require('http-proxy'),
fs = require('fs');
var config = require('./config/config.json');
var proxy = httpProxy.createProxyServer({});
function proxyHttpResponse(req, res) {
var hostname = req.headers.host.split(":")[0];
var pathname = url.parse(req.url).pathname;
try {
var options = {
target: 'http://' + config.http.host + ':' + config.http.port + '/'
};
proxy.web(req, res, options);
} catch (e) {
console.log('Error: ' + e.message);
}
}
function proxyWebsocketResponse(req, res) {
var hostname = req.headers.host.split(":")[0];
var pathname = url.parse(req.url).pathname;
if (pathname === '/ws/') {
try {
var options = {
target: 'ws://' + config.websocket.host + ':' + config.websocket.port + '/',
ws: true
};
proxy.ws(req, res, options);
} catch (e) {
console.log('Error: ' + e.message);
}
} else {
res.statusCode = 501;
res.end('Not Implemented');
}
}
if (config.server.ssl) {
var options = {
port: config.server.sslPort,
key: fs.readFileSync(config.server.sslKey),
cert: fs.readFileSync(config.server.sslCert)
};
var server = https.createServer(options, proxyHttpResponse).listen(config.server.sslPort, function () {
console.log('Proxy server (SSL) started on *:' + config.server.sslPort);
});
} else {
var server = http.createServer(proxyHttpResponse).listen(config.server.port, function () {
console.log('Proxy server started on *:' + config.server.port);
});
}
server.addListener('upgrade', proxyWebsocketResponse);
{
"debug": true,
"server": {
"ssl": true,
"port": 80,
"sslPort": 443,
"sslKey" : "cert/server.key",
"sslCert" : "cert/server.pem"
},
"http": {
"port": 8080,
"host": "127.0.0.1"
},
"websocket": {
"port": 8095,
"host": "127.0.0.1"
}
}
Web UI, WebSocket и проблема самоподписанных сертификатов