removes all dependency on domains since they're being deprecated

This commit is contained in:
Zachary Boyd 2018-08-09 13:42:11 -04:00
parent 41aea76a95
commit f08aa6d23f
2 changed files with 72 additions and 104 deletions

View file

@ -1,6 +1,5 @@
const http = require('http'); const http = require('http');
const Server = http.Server; const Server = http.Server;
const domain = require('domain');
const socks = require('socksv5'); const socks = require('socksv5');
const URL = require('url'); const URL = require('url');
const SocksProxyAgent = require('socks-proxy-agent'); const SocksProxyAgent = require('socks-proxy-agent');
@ -8,13 +7,8 @@ const SocksProxyAgent = require('socks-proxy-agent');
class HTTPServer extends Server { class HTTPServer extends Server {
constructor(tor_pool, logger, nconf) { constructor(tor_pool, logger, nconf) {
let handle_http_connections = (req, res) => { let handle_http_connections = (req, res) => {
let d = domain.create(); this.logger.error(`[http-proxy]: an error occured: ${error.message}`)
d.on('error', (error) => { res.end();
this.logger.error(`[http-proxy]: an error occured: ${error.message}`)
res.end();
});
d.add(req);
d.add(res);
let url = URL.parse(req.url); let url = URL.parse(req.url);
url.port = url.port || 80; url.port = url.port || 80;
@ -37,47 +31,45 @@ class HTTPServer extends Server {
let socks_port = tor_instance.socks_port; let socks_port = tor_instance.socks_port;
logger && logger.verbose(`[http-proxy]: ${req.connection.remoteAddress}:${req.connection.remotePort} → 127.0.0.1:${socks_port}${url.hostname}:${url.port}`); logger && logger.verbose(`[http-proxy]: ${req.connection.remoteAddress}:${req.connection.remotePort} → 127.0.0.1:${socks_port}${url.hostname}:${url.port}`);
d.run(() => { let proxy_req = http.request({
let proxy_req = http.request({ method: req.method,
method: req.method, hostname: url.hostname,
hostname: url.hostname, port: url.port,
port: url.port, path: url.path,
path: url.path, headers: req.headers,
headers: req.headers, agent: new SocksProxyAgent(`socks://127.0.0.1:${socks_port}`)
agent: new SocksProxyAgent(`socks://127.0.0.1:${socks_port}`) }, (proxy_res) => {
}, (proxy_res) => { d.add(proxy_res);
d.add(proxy_res); proxy_res.on('data', (chunk) => {
proxy_res.on('data', (chunk) => { res.write(chunk);
res.write(chunk);
});
proxy_res.on('end', () => {
res.end();
});
res.writeHead(proxy_res.statusCode, proxy_res.headers);
}); });
req.removeListener('data', onIncomingData); proxy_res.on('end', () => {
res.end();
});
req.on('data', (chunk) => { res.writeHead(proxy_res.statusCode, proxy_res.headers);
proxy_req.write(chunk);
})
req.on('end', () => {
proxy_req.end();
})
while (buffer.length) {
proxy_req.write(buffer.shift());
}
if (req.finished)
proxy_req.end();
d.add(proxy_req);
}); });
req.removeListener('data', onIncomingData);
req.on('data', (chunk) => {
proxy_req.write(chunk);
})
req.on('end', () => {
proxy_req.end();
})
while (buffer.length) {
proxy_req.write(buffer.shift());
}
if (req.finished)
proxy_req.end();
}; };
if (tor_pool.instances.length) { if (tor_pool.instances.length) {
connect(tor_pool.next()); connect(tor_pool.next());
} else { } else {
@ -87,10 +79,6 @@ class HTTPServer extends Server {
}; };
let handle_connect_connections = (req, inbound_socket, head) => { let handle_connect_connections = (req, inbound_socket, head) => {
let d = domain.create();
d.add(inbound_socket);
let hostname = req.url.split(':').shift(); let hostname = req.url.split(':').shift();
let port = Number(req.url.split(':').pop()); let port = Number(req.url.split(':').pop());
@ -107,39 +95,30 @@ class HTTPServer extends Server {
if (error) if (error)
this.logger.error(`[http-connect]: an error occured: ${error.message}`) this.logger.error(`[http-connect]: an error occured: ${error.message}`)
d.exit();
}; };
d.on('error', onClose);
d.add(inbound_socket);
var buffer = [head]; var buffer = [head];
let onInboundData = function (data) { let onInboundData = function (data) {
buffer.push(data); buffer.push(data);
}; };
d.run(() => { socks.connect({
socks.connect({ host: hostname,
host: hostname, port: port,
port: port, proxyHost: '127.0.0.1',
proxyHost: '127.0.0.1', proxyPort: socks_port,
proxyPort: socks_port, localDNS: false,
localDNS: false, auths: [ socks.auth.None() ]
auths: [ socks.auth.None() ] }, ($outbound_socket) => {
}, ($outbound_socket) => { outbound_socket = $outbound_socket;
outbound_socket = $outbound_socket; outbound_socket && outbound_socket.on('close', onClose);
d.add(outbound_socket); outbound_socket && outbound_socket.on('error', onClose);
outbound_socket && outbound_socket.on('close', onClose);
outbound_socket && outbound_socket.on('error', onClose);
inbound_socket.write('HTTP/1.1 200 Connection Established\r\n'+'Proxy-agent: tor-router\r\n' +'\r\n'); inbound_socket.write('HTTP/1.1 200 Connection Established\r\n'+'Proxy-agent: tor-router\r\n' +'\r\n');
outbound_socket.write(head); outbound_socket.write(head);
outbound_socket.pipe(inbound_socket); outbound_socket.pipe(inbound_socket);
inbound_socket.pipe(outbound_socket); inbound_socket.pipe(outbound_socket);
})
}); });
}; };
if (tor_pool.instances.length) { if (tor_pool.instances.length) {

View file

@ -1,14 +1,10 @@
const socks = require('socksv5'); const socks = require('socksv5');
const SOCKS5Server = socks.Server; const SOCKS5Server = socks.Server;
const domain = require('domain');
class SOCKSServer extends SOCKS5Server{ class SOCKSServer extends SOCKS5Server{
constructor(tor_pool, logger, nconf) { constructor(tor_pool, logger, nconf) {
let handleConnection = (info, accept, deny) => { let handleConnection = (info, accept, deny) => {
let d = domain.create();
let inbound_socket = accept(true); let inbound_socket = accept(true);
d.add(inbound_socket);
var outbound_socket; var outbound_socket;
let buffer = []; let buffer = [];
@ -22,8 +18,6 @@ class SOCKSServer extends SOCKS5Server{
if (error) if (error)
this.logger.error(`[socks]: an error occured: ${error.message}`) this.logger.error(`[socks]: an error occured: ${error.message}`)
d.exit();
}; };
if (!inbound_socket) return; if (!inbound_socket) return;
@ -36,36 +30,31 @@ class SOCKSServer extends SOCKS5Server{
let socks_port = tor_instance.socks_port; let socks_port = tor_instance.socks_port;
logger && logger.verbose(`[socks]: ${info.srcAddr}:${info.srcPort} → 127.0.0.1:${socks_port}${tor_instance.definition.Name ? ' ('+tor_instance.definition.Name+')' : '' }${info.dstAddr}:${info.dstPort}`) logger && logger.verbose(`[socks]: ${info.srcAddr}:${info.srcPort} → 127.0.0.1:${socks_port}${tor_instance.definition.Name ? ' ('+tor_instance.definition.Name+')' : '' }${info.dstAddr}:${info.dstPort}`)
d.on('error', onClose); socks.connect({
host: info.dstAddr,
port: info.dstPort,
proxyHost: '127.0.0.1',
proxyPort: socks_port,
localDNS: false,
auths: [ socks.auth.None() ]
}, ($outbound_socket) => {
outbound_socket = $outbound_socket;
outbound_socket && outbound_socket.on('close', onClose);
d.run(() => { inbound_socket && inbound_socket.removeListener('data', onInboundData);
socks.connect({ inbound_socket && inbound_socket.on('data', (data) => {
host: info.dstAddr, outbound_socket && outbound_socket.write(data);
port: info.dstPort, });
proxyHost: '127.0.0.1',
proxyPort: socks_port,
localDNS: false,
auths: [ socks.auth.None() ]
}, ($outbound_socket) => {
outbound_socket = $outbound_socket;
d.add(outbound_socket);
outbound_socket && outbound_socket.on('close', onClose);
inbound_socket && inbound_socket.removeListener('data', onInboundData); outbound_socket && outbound_socket.on('data', (data) => {
inbound_socket && inbound_socket.on('data', (data) => { inbound_socket && inbound_socket.write(data);
outbound_socket && outbound_socket.write(data); });
});
outbound_socket && outbound_socket.on('data', (data) => { outbound_socket && outbound_socket.on('error', onClose);
inbound_socket && inbound_socket.write(data);
});
outbound_socket && outbound_socket.on('error', onClose); while (buffer && buffer.length && outbound_socket) {
outbound_socket.write(buffer.shift());
while (buffer && buffer.length && outbound_socket) { }
outbound_socket.write(buffer.shift());
}
})
}); });
}; };
if (tor_pool.instances.length) { if (tor_pool.instances.length) {