/** * Module dependencies. */ var fs = require('fs'); var url = require('url'); var http = require('http'); var https = require('https'); var assert = require('assert'); var socks = require('socksv5'); var getRawBody = require('raw-body'); var SocksProxyAgent = require('../'); describe('SocksProxyAgent', function () { var httpServer, httpPort; var httpsServer, httpsPort; var socksServer, socksPort; before(function (done) { // setup SOCKS proxy server socksServer = socks.createServer(function(info, accept, deny) { accept(); }); socksServer.listen(0, '127.0.0.1', function() { socksPort = socksServer.address().port; //console.log('SOCKS server listening on port %d', socksPort); done(); }); socksServer.useAuth(socks.auth.None()); //socksServer.useAuth(socks.auth.UserPassword(function(user, password, cb) { // cb(user === 'nodejs' && password === 'rules!'); //})); }); before(function (done) { // setup target HTTP server httpServer = http.createServer(); httpServer.listen(function () { httpPort = httpServer.address().port; done(); }); }); before(function (done) { // setup target SSL HTTPS server var options = { key: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.key'), cert: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.pem') }; httpsServer = https.createServer(options); httpsServer.listen(function () { httpsPort = httpsServer.address().port; done(); }); }); after(function (done) { socksServer.once('close', function () { done(); }); socksServer.close(); }); after(function (done) { httpServer.once('close', function () { done(); }); httpServer.close(); }); after(function (done) { httpsServer.once('close', function () { done(); }); httpsServer.close(); }); describe('constructor', function () { it('should throw an Error if no "proxy" argument is given', function () { assert.throws(function () { new SocksProxyAgent(); }); }); it('should accept a "string" proxy argument', function () { var agent = new SocksProxyAgent('socks://127.0.0.1:' + socksPort); assert.equal('127.0.0.1', agent.proxy.host); assert.equal(socksPort, agent.proxy.port); }); it('should accept a `url.parse()` result object argument', function () { var opts = url.parse('socks://127.0.0.1:' + socksPort); var agent = new SocksProxyAgent(opts); assert.equal('127.0.0.1', agent.proxy.host); assert.equal(socksPort, agent.proxy.port); }); }); describe('"http" module', function () { it('should work against an HTTP endpoint', function (done) { httpServer.once('request', function (req, res) { assert.equal('/foo', req.url); res.statusCode = 404; res.end(JSON.stringify(req.headers)); }); var agent = new SocksProxyAgent('socks://127.0.0.1:' + socksPort); var opts = url.parse('http://127.0.0.1:' + httpPort + '/foo'); opts.agent = agent; opts.headers = { foo: 'bar' }; var req = http.get(opts, function (res) { assert.equal(404, res.statusCode); getRawBody(res, 'utf8', function (err, buf) { if (err) return done(err); var data = JSON.parse(buf); assert.equal('bar', data.foo); done(); }); }); req.once('error', done); }); }); describe('"https" module', function () { it('should work against an HTTPS endpoint', function (done) { httpsServer.once('request', function (req, res) { assert.equal('/foo', req.url); res.statusCode = 404; res.end(JSON.stringify(req.headers)); }); var agent = new SocksProxyAgent('socks://127.0.0.1:' + socksPort); var opts = url.parse('https://127.0.0.1:' + httpsPort + '/foo'); opts.agent = agent; opts.rejectUnauthorized = false; opts.headers = { foo: 'bar' }; var req = https.get(opts, function (res) { assert.equal(404, res.statusCode); getRawBody(res, 'utf8', function (err, buf) { if (err) return done(err); var data = JSON.parse(buf); assert.equal('bar', data.foo); done(); }); }); req.once('error', done); }); }); });