mirror of
https://github.com/avwo/whistle.git
synced 2026-10-29 07:06:36 +08:00
feat: handle the tunnel request of proxifier
This commit is contained in:
+13
-3
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user