feat: handle the tunnel request of proxifier

This commit is contained in:
avwo
2018-06-06 11:16:26 +08:00
parent bf8bc58661
commit 720fb00f96
3 changed files with 19 additions and 5 deletions
+13 -3
View File
@@ -547,12 +547,14 @@ function setRuleHeaders(headers, rulesHeaders) {
}
}
var HTTP_RE = /^\w+\s+[^\s]+\s+HTTP\/1.1(?:\r?\n|\r)/;
var CONNECT_RE = /^CONNECT\s+([^\s]+)\s+HTTP\/1.\d$/mi;
var HTTP_RE = /^\w+\s+[^\s]+\s+HTTP\/1.\d$/mi;
var CRLF = util.toBuffer('\r\n');
module.exports = function(socket, hostname, callback, next) {
var reqSocket, destroyed, timer;
var rulesHeaders = socket.rulesHeaders;
var isConnect, headersStr;
function destroy(err) {
if (destroyed) {
return;
@@ -569,15 +571,23 @@ module.exports = function(socket, hostname, callback, next) {
socket.on('data', request);
socket.on('end', request);
var clientIp = socket.clientIp;
timer = setTimeout(request, util.isLocalAddress(clientIp) ? LOCAL_TIMEOUT : TIMEOUT);
var timeout = util.isLocalAddress(clientIp) ? LOCAL_TIMEOUT : TIMEOUT;
timer = setTimeout(request, timeout);
function request(chunk) {
clearTimeout(timer);
headersStr = chunk && chunk.toString();
if (chunk && !isConnect && CONNECT_RE.test(headersStr)) {
isConnect = true;
hostname = RegExp.$1.split(':')[0];
timer = setTimeout(request, timeout);
util.setEstablished(socket);
return;
}
socket.removeListener('data', request);
socket.removeListener('end', request);
if (!chunk) {//没有数据
return next(chunk);
}
var headersStr = chunk.toString();
if (/upgrade\s*:\s*websocket/i.test(headersStr)) { //ws
parseReq(socket, function(err, socket) {
if (err) {