mirror of
https://github.com/avwo/whistle.git
synced 2026-10-29 15:09:28 +08:00
refactor: refine code
This commit is contained in:
+23
-9
@@ -34,6 +34,7 @@ var tunnelTmplData = new LRU({ max: 3000, maxAge: 30000 });
|
||||
var TIMEOUT = 6000;
|
||||
var CONN_TIMEOUT = 60000;
|
||||
var X_RE = /^x/;
|
||||
var PROTO_SEP_RE = /,\s*/;
|
||||
var proxy, server;
|
||||
|
||||
function handleWebsocket(socket, clientIp, clientPort) {
|
||||
@@ -49,11 +50,22 @@ function handleWebsocket(socket, clientIp, clientPort) {
|
||||
pluginMgr.resolvePipePlugin(socket, function () {
|
||||
socket.rules = rules.initRules(socket);
|
||||
rules.resolveRulesFile(socket, function () {
|
||||
socket.isWebSocket = util.isWebSocket(socket.headers) || socket.enable.websocket;
|
||||
resolveWebsocket(socket, wss);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getTransProto(str) {
|
||||
if (!str || typeof str !== 'string') {
|
||||
return;
|
||||
}
|
||||
if (str.indexOf(',') === -1) {
|
||||
return str;
|
||||
}
|
||||
return str.trim().split(PROTO_SEP_RE)[0];
|
||||
}
|
||||
|
||||
function resolveWebsocket(socket, wss) {
|
||||
var headers = socket.headers;
|
||||
var reqEmitter = new EventEmitter();
|
||||
@@ -112,16 +124,18 @@ function resolveWebsocket(socket, wss) {
|
||||
var isSuccess = status == 101;
|
||||
if (isSuccess) {
|
||||
statusMsg = 'HTTP/1.1 101 Switching Protocols';
|
||||
var protocol = (headers['sec-websocket-protocol'] || '').split(/, */);
|
||||
var key =
|
||||
headers['sec-websocket-key'] + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
|
||||
key = crypto.createHash('sha1').update(key, 'binary').digest('base64');
|
||||
resHeaders['Sec-WebSocket-Accept'] = key;
|
||||
resHeaders.Upgrade = 'websocket';
|
||||
resHeaders.Connection = 'Upgrade';
|
||||
if (protocol[0]) {
|
||||
resHeaders['Sec-WebSocket-Protocol'] = protocol[0];
|
||||
var key = headers['sec-websocket-key'];
|
||||
var protocol = getTransProto(headers['sec-websocket-protocol']);
|
||||
var upgrade = getTransProto(headers.upgrade);
|
||||
if (key) {
|
||||
key += '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
|
||||
resHeaders['Sec-WebSocket-Accept'] = crypto.createHash('sha1').update(key, 'binary').digest('base64');
|
||||
}
|
||||
if (protocol) {
|
||||
resHeaders['Sec-WebSocket-Protocol'] = protocol;
|
||||
}
|
||||
resHeaders.Upgrade = upgrade || 'websocket';
|
||||
resHeaders.Connection = 'Upgrade';
|
||||
reqSocket = util.getEmptyRes();
|
||||
reqSocket.headers = resHeaders;
|
||||
socketMgr.handleUpgrade(socket, reqSocket);
|
||||
|
||||
Reference in New Issue
Block a user