added API route to start/stop a socks5 proxy server
This commit is contained in:
parent
4a6d21f0b5
commit
2b70001309
|
@ -0,0 +1,73 @@
|
|||
'use strict';
|
||||
|
||||
module.exports.create = function () {
|
||||
var PromiseA = require('bluebird');
|
||||
var enableDestroy = require('server-destroy');
|
||||
var server;
|
||||
|
||||
function curState() {
|
||||
if (!server) {
|
||||
return PromiseA.resolve({running: false});
|
||||
}
|
||||
return PromiseA.resolve({
|
||||
running: true
|
||||
, port: server.address().port
|
||||
});
|
||||
}
|
||||
|
||||
function start() {
|
||||
if (server) {
|
||||
return curState();
|
||||
}
|
||||
|
||||
server = require('socksv5').createServer(function (info, accept) {
|
||||
accept();
|
||||
});
|
||||
|
||||
enableDestroy(server);
|
||||
server.on('close', function () {
|
||||
server = null;
|
||||
});
|
||||
|
||||
server.useAuth(require('socksv5').auth.None());
|
||||
|
||||
return new PromiseA(function (resolve, reject) {
|
||||
server.on('error', function (err) {
|
||||
if (err.code === 'EADDRINUSE') {
|
||||
server.listen(0);
|
||||
} else {
|
||||
server = null;
|
||||
reject(err);
|
||||
}
|
||||
});
|
||||
server.listen(1080, function () {
|
||||
resolve(curState());
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function stop() {
|
||||
if (!server) {
|
||||
return curState();
|
||||
}
|
||||
return new PromiseA(function (resolve, reject) {
|
||||
var timeoutId = setTimeout(function () {
|
||||
server.destroy();
|
||||
}, 1000);
|
||||
server.close(function (err) {
|
||||
clearTimeout(timeoutId);
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
isRunning: curState
|
||||
, start: start
|
||||
, stop: stop
|
||||
};
|
||||
};
|
|
@ -38,6 +38,7 @@ function create(conf) {
|
|||
}
|
||||
}
|
||||
};
|
||||
deps.socks5 = require('./socks5-server').create(deps, conf);
|
||||
|
||||
require('./goldilocks.js').create(deps, conf);
|
||||
process.removeListener('message', create);
|
||||
|
|
|
@ -326,6 +326,32 @@ module.exports.create = function (deps, conf) {
|
|||
});
|
||||
});
|
||||
}
|
||||
, socks5: function (req, res) {
|
||||
if (handleCors(req, res, ['GET', 'POST', 'DELETE'])) {
|
||||
return;
|
||||
}
|
||||
isAuthorized(req, res, function () {
|
||||
var method = req.method.toUpperCase();
|
||||
var prom;
|
||||
|
||||
if (method === 'POST') {
|
||||
prom = deps.socks5.start();
|
||||
} else if (method === 'DELETE') {
|
||||
prom = deps.socks5.stop();
|
||||
} else {
|
||||
prom = deps.socks5.curState();
|
||||
}
|
||||
|
||||
res.setHeader('Content-Type', 'application/json;');
|
||||
prom.then(function (result) {
|
||||
res.end(JSON.stringify(result));
|
||||
}, function (err) {
|
||||
err.message = err.message || err.toString();
|
||||
res.statusCode = 500;
|
||||
res.end(JSON.stringify({error: {message: err.message, code: err.code}}));
|
||||
});
|
||||
});
|
||||
}
|
||||
, _api: api
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue