145 lines
4.3 KiB
JavaScript
145 lines
4.3 KiB
JavaScript
|
|
||
|
/**
|
||
|
* 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);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
});
|