diff --git a/lib/https/index.js b/lib/https/index.js index 2726711bd..45a0c16f1 100644 --- a/lib/https/index.js +++ b/lib/https/index.js @@ -65,19 +65,25 @@ function handleWebsocket(socket, wss, callback) { destroy(new Error('timeout')); }); - if (proxyUrl) { - var isSocks = /^socks:\/\//.test(proxyUrl); - proxyUrl = (wss ? 'wss:' : 'ws:') + util.removeProtocol(proxyUrl); + function resolveHost(url, callback) { rules.resolveHost(proxyUrl, function(err, ip, customHost) { - reqEmitter.customHost = customHost; if (err) { return execCallback(err); } - options = url.parse(proxyUrl); + reqEmitter.customHost = customHost; reqEmitter.host = ip; reqEmitter.dnsTime = Date.now() - now; reqEmitter.emit('send'); + callback(ip); + }, mustRemoteHost); + } + + if (proxyUrl) { + var isSocks = /^socks:\/\//.test(proxyUrl); + proxyUrl = (wss ? 'wss:' : 'ws:') + util.removeProtocol(proxyUrl); + resolveHost(proxyUrl, function(ip) { + options = url.parse(proxyUrl); if (util.isLocalAddress(ip) && (!options.port || options.port == config.port)) { return execCallback(new Error('Unable to agent to itself (' + ip + ':' + config.port + ')')); } @@ -102,8 +108,7 @@ function handleWebsocket(socket, wss, callback) { abortIfUnavailable(reqSocket); pipeData(); }); - - }, mustRemoteHost); + }); } else { matchedUrl = util.rule.getUrl(_rules.rule); if (/^wss?:\/\//.test(matchedUrl)) { @@ -113,16 +118,7 @@ function handleWebsocket(socket, wss, callback) { } options = url.parse(fullUrl); - - rules.resolveHost(fullUrl, function(err, ip, customHost) { - reqEmitter.customHost = customHost; - if (err) { - return execCallback(err); - } - reqEmitter.host = ip; - reqEmitter.dnsTime = Date.now() - now; - reqEmitter.emit('send'); - + resolveHost(fullUrl, function(ip) { var isWss = options.protocol == 'wss'; reqSocket = (isWss ? tls : net).connect({ rejectUnauthorized: false, @@ -130,7 +126,7 @@ function handleWebsocket(socket, wss, callback) { port: options.port || (isWss ? 443 : 80) }, pipeData); abortIfUnavailable(reqSocket); - }, mustRemoteHost); + }); }