You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							355 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
	
	
							355 lines
						
					
					
						
							10 KiB
						
					
					
				
 | 
						|
/**
 | 
						|
 * Module dependencies.
 | 
						|
 */
 | 
						|
 | 
						|
var fs = require('fs');
 | 
						|
var url = require('url');
 | 
						|
var http = require('http');
 | 
						|
var https = require('https');
 | 
						|
var assert = require('assert');
 | 
						|
var toBuffer = require('stream-to-buffer');
 | 
						|
var Proxy = require('proxy');
 | 
						|
var socks = require('socksv5');
 | 
						|
var ProxyAgent = require('../');
 | 
						|
 | 
						|
describe('ProxyAgent', function () {
 | 
						|
  // target servers
 | 
						|
  var httpServer, httpPort;
 | 
						|
  var httpsServer, httpsPort;
 | 
						|
 | 
						|
  // proxy servers
 | 
						|
  var socksServer, socksPort;
 | 
						|
  var proxyServer, proxyPort;
 | 
						|
  var proxyHttpsServer, proxyHttpsPort;
 | 
						|
 | 
						|
  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();
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  before(function (done) {
 | 
						|
    // setup SOCKS proxy server
 | 
						|
    socksServer = socks.createServer(function(info, accept, deny) {
 | 
						|
      accept();
 | 
						|
    });
 | 
						|
    socksServer.listen(function() {
 | 
						|
      socksPort = socksServer.address().port;
 | 
						|
      done();
 | 
						|
    });
 | 
						|
    socksServer.useAuth(socks.auth.None());
 | 
						|
  });
 | 
						|
 | 
						|
  before(function (done) {
 | 
						|
    // setup HTTP proxy server
 | 
						|
    proxyServer = Proxy();
 | 
						|
    proxyServer.listen(function () {
 | 
						|
      proxyPort = proxyServer.address().port;
 | 
						|
      done();
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  before(function (done) {
 | 
						|
    // setup SSL HTTPS proxy server
 | 
						|
    var options = {
 | 
						|
      key: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.key'),
 | 
						|
      cert: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.pem')
 | 
						|
    };
 | 
						|
    proxyHttpsServer = Proxy(https.createServer(options));
 | 
						|
    proxyHttpsServer.listen(function () {
 | 
						|
      proxyHttpsPort = proxyHttpsServer.address().port;
 | 
						|
      done();
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
 | 
						|
  after(function (done) {
 | 
						|
    //socksServer.once('close', function () { done(); });
 | 
						|
    socksServer.close();
 | 
						|
    done();
 | 
						|
  });
 | 
						|
 | 
						|
  after(function (done) {
 | 
						|
    //httpServer.once('close', function () { done(); });
 | 
						|
    httpServer.close();
 | 
						|
    done();
 | 
						|
  });
 | 
						|
 | 
						|
  after(function (done) {
 | 
						|
    //httpsServer.once('close', function () { done(); });
 | 
						|
    httpsServer.close();
 | 
						|
    done();
 | 
						|
  });
 | 
						|
 | 
						|
  after(function (done) {
 | 
						|
    //proxyServer.once('close', function () { done(); });
 | 
						|
    proxyServer.close();
 | 
						|
    done();
 | 
						|
  });
 | 
						|
 | 
						|
  after(function (done) {
 | 
						|
    //proxyHttpsServer.once('close', function () { done(); });
 | 
						|
    proxyHttpsServer.close();
 | 
						|
    done();
 | 
						|
  });
 | 
						|
 | 
						|
  it('should export a "function"', function () {
 | 
						|
    assert.equal('function', typeof ProxyAgent);
 | 
						|
  });
 | 
						|
 | 
						|
  describe('constructor', function () {
 | 
						|
    it('should throw a TypeError if no "protocol" is given', function () {
 | 
						|
      assert.throws(function () {
 | 
						|
        ProxyAgent({ host: 'foo.com', port: 3128 });
 | 
						|
      }, function (e) {
 | 
						|
        return 'TypeError' === e.name &&
 | 
						|
          /must specify a "protocol"/.test(e.message) &&
 | 
						|
          /\bhttp\b/.test(e.message) &&
 | 
						|
          /\bhttps\b/.test(e.message) &&
 | 
						|
          /\bsocks\b/.test(e.message);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    it('should throw a TypeError for unsupported proxy protocols', function () {
 | 
						|
      assert.throws(function () {
 | 
						|
        ProxyAgent('bad://foo.com:8888');
 | 
						|
      }, function (e) {
 | 
						|
        return 'TypeError' === e.name &&
 | 
						|
          /unsupported proxy protocol/.test(e.message);
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  describe('"http" module', function () {
 | 
						|
    describe('over "http" proxy', function () {
 | 
						|
      it('should work', function (done) {
 | 
						|
        httpServer.once('request', function (req, res) {
 | 
						|
          res.end(JSON.stringify(req.headers));
 | 
						|
        });
 | 
						|
 | 
						|
        var uri = 'http://localhost:' + proxyPort;
 | 
						|
        var agent = new ProxyAgent(uri);
 | 
						|
 | 
						|
        var opts = url.parse('http://localhost:' + httpPort + '/test');
 | 
						|
        opts.agent = agent;
 | 
						|
 | 
						|
        var req = http.get(opts, function (res) {
 | 
						|
          toBuffer(res, function (err, buf) {
 | 
						|
            if (err) return done(err);
 | 
						|
            var data = JSON.parse(buf.toString('utf8'));
 | 
						|
            assert.equal('localhost:' + httpPort, data.host);
 | 
						|
            assert('via' in data);
 | 
						|
            done();
 | 
						|
          });
 | 
						|
        });
 | 
						|
        req.once('error', done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('over "http" proxy from env', function () {
 | 
						|
      it('should work', function (done) {
 | 
						|
        httpServer.once('request', function (req, res) {
 | 
						|
          res.end(JSON.stringify(req.headers));
 | 
						|
        });
 | 
						|
 | 
						|
        process.env.HTTP_PROXY = 'http://localhost:' + proxyPort;
 | 
						|
        var agent = new ProxyAgent();
 | 
						|
 | 
						|
        var opts = url.parse('http://localhost:' + httpPort + '/test');
 | 
						|
        opts.agent = agent;
 | 
						|
 | 
						|
        var req = http.get(opts, function (res) {
 | 
						|
          toBuffer(res, function (err, buf) {
 | 
						|
            if (err) return done(err);
 | 
						|
            var data = JSON.parse(buf.toString('utf8'));
 | 
						|
            assert.equal('localhost:' + httpPort, data.host);
 | 
						|
            assert('via' in data);
 | 
						|
            done();
 | 
						|
          });
 | 
						|
        });
 | 
						|
        req.once('error', done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('with no proxy from env', function () {
 | 
						|
      it('should work', function (done) {
 | 
						|
        httpServer.once('request', function (req, res) {
 | 
						|
          res.end(JSON.stringify(req.headers));
 | 
						|
        });
 | 
						|
 | 
						|
        process.env.NO_PROXY = '*';
 | 
						|
        var agent = new ProxyAgent();
 | 
						|
 | 
						|
        var opts = url.parse('http://localhost:' + httpPort + '/test');
 | 
						|
        opts.agent = agent;
 | 
						|
 | 
						|
        var req = http.get(opts, function (res) {
 | 
						|
          toBuffer(res, function (err, buf) {
 | 
						|
            if (err) return done(err);
 | 
						|
            var data = JSON.parse(buf.toString('utf8'));
 | 
						|
            assert.equal('localhost:' + httpPort, data.host);
 | 
						|
            assert(!('via' in data));
 | 
						|
            done();
 | 
						|
          });
 | 
						|
        });
 | 
						|
        req.once('error', done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('over "https" proxy', function () {
 | 
						|
      it('should work', function (done) {
 | 
						|
        httpServer.once('request', function (req, res) {
 | 
						|
          res.end(JSON.stringify(req.headers));
 | 
						|
        });
 | 
						|
 | 
						|
        var uri = 'https://localhost:' + proxyHttpsPort;
 | 
						|
        var proxy = url.parse(uri);
 | 
						|
        proxy.rejectUnauthorized = false;
 | 
						|
        var agent = new ProxyAgent(proxy);
 | 
						|
 | 
						|
        var opts = url.parse('http://localhost:' + httpPort + '/test');
 | 
						|
        opts.agent = agent;
 | 
						|
 | 
						|
        var req = http.get(opts, function (res) {
 | 
						|
          toBuffer(res, function (err, buf) {
 | 
						|
            if (err) return done(err);
 | 
						|
            var data = JSON.parse(buf.toString('utf8'));
 | 
						|
            assert.equal('localhost:' + httpPort, data.host);
 | 
						|
            assert('via' in data);
 | 
						|
            done();
 | 
						|
          });
 | 
						|
        });
 | 
						|
        req.once('error', done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('over "socks" proxy', function () {
 | 
						|
      it('should work', function (done) {
 | 
						|
        httpServer.once('request', function (req, res) {
 | 
						|
          res.end(JSON.stringify(req.headers));
 | 
						|
        });
 | 
						|
 | 
						|
        var uri = 'socks://localhost:' + socksPort;
 | 
						|
        var agent = new ProxyAgent(uri);
 | 
						|
 | 
						|
        var opts = url.parse('http://localhost:' + httpPort + '/test');
 | 
						|
        opts.agent = agent;
 | 
						|
 | 
						|
        var req = http.get(opts, function (res) {
 | 
						|
          toBuffer(res, function (err, buf) {
 | 
						|
            if (err) return done(err);
 | 
						|
            var data = JSON.parse(buf.toString('utf8'));
 | 
						|
            assert.equal('localhost:' + httpPort, data.host);
 | 
						|
            done();
 | 
						|
          });
 | 
						|
        });
 | 
						|
        req.once('error', done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  describe('"https" module', function () {
 | 
						|
    describe('over "http" proxy', function () {
 | 
						|
      it('should work', function (done) {
 | 
						|
        httpsServer.once('request', function (req, res) {
 | 
						|
          res.end(JSON.stringify(req.headers));
 | 
						|
        });
 | 
						|
 | 
						|
        var uri = 'http://localhost:' + proxyPort;
 | 
						|
        var agent = new ProxyAgent(uri);
 | 
						|
 | 
						|
        var opts = url.parse('https://localhost:' + httpsPort + '/test');
 | 
						|
        opts.agent = agent;
 | 
						|
        opts.rejectUnauthorized = false;
 | 
						|
 | 
						|
        var req = https.get(opts, function (res) {
 | 
						|
          toBuffer(res, function (err, buf) {
 | 
						|
            if (err) return done(err);
 | 
						|
            var data = JSON.parse(buf.toString('utf8'));
 | 
						|
            assert.equal('localhost:' + httpsPort, data.host);
 | 
						|
            done();
 | 
						|
          });
 | 
						|
        });
 | 
						|
        req.once('error', done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('over "https" proxy', function () {
 | 
						|
      it('should work', function (done) {
 | 
						|
        var gotReq = false;
 | 
						|
        httpsServer.once('request', function (req, res) {
 | 
						|
          gotReq = true;
 | 
						|
          res.end(JSON.stringify(req.headers));
 | 
						|
        });
 | 
						|
 | 
						|
        var agent = new ProxyAgent({
 | 
						|
          protocol: 'https:',
 | 
						|
          host: 'localhost',
 | 
						|
          port: proxyHttpsPort,
 | 
						|
          rejectUnauthorized: false
 | 
						|
        });
 | 
						|
 | 
						|
        var opts = url.parse('https://localhost:' + httpsPort + '/test');
 | 
						|
        opts.agent = agent;
 | 
						|
        opts.rejectUnauthorized = false;
 | 
						|
 | 
						|
        var req = https.get(opts, function (res) {
 | 
						|
          toBuffer(res, function (err, buf) {
 | 
						|
            if (err) return done(err);
 | 
						|
            var data = JSON.parse(buf.toString('utf8'));
 | 
						|
            assert.equal('localhost:' + httpsPort, data.host);
 | 
						|
            assert(gotReq);
 | 
						|
            done();
 | 
						|
          });
 | 
						|
        });
 | 
						|
        req.once('error', done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('over "socks" proxy', function () {
 | 
						|
      it('should work', function (done) {
 | 
						|
        var gotReq = false;
 | 
						|
        httpsServer.once('request', function (req, res) {
 | 
						|
          gotReq = true;
 | 
						|
          res.end(JSON.stringify(req.headers));
 | 
						|
        });
 | 
						|
 | 
						|
        var uri = 'socks://localhost:' + socksPort;
 | 
						|
        var agent = new ProxyAgent(uri);
 | 
						|
 | 
						|
        var opts = url.parse('https://localhost:' + httpsPort + '/test');
 | 
						|
        opts.agent = agent;
 | 
						|
        opts.rejectUnauthorized = false;
 | 
						|
 | 
						|
        var req = https.get(opts, function (res) {
 | 
						|
          toBuffer(res, function (err, buf) {
 | 
						|
            if (err) return done(err);
 | 
						|
            var data = JSON.parse(buf.toString('utf8'));
 | 
						|
            assert.equal('localhost:' + httpsPort, data.host);
 | 
						|
            assert(gotReq);
 | 
						|
            done();
 | 
						|
          });
 | 
						|
        });
 | 
						|
        req.once('error', done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |