109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								var http = require('http');
							 | 
						||
| 
								 | 
							
								var net = require('net');
							 | 
						||
| 
								 | 
							
								var should = require('should');
							 | 
						||
| 
								 | 
							
								var tunnel = require('../index');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('HTTP over HTTP', function() {
							 | 
						||
| 
								 | 
							
								  it('should finish without error', function(done) {
							 | 
						||
| 
								 | 
							
								    var serverPort = 3000;
							 | 
						||
| 
								 | 
							
								    var proxyPort = 3001;
							 | 
						||
| 
								 | 
							
								    var poolSize = 3;
							 | 
						||
| 
								 | 
							
								    var N = 10;
							 | 
						||
| 
								 | 
							
								    var serverConnect = 0;
							 | 
						||
| 
								 | 
							
								    var proxyConnect = 0;
							 | 
						||
| 
								 | 
							
								    var clientConnect = 0;
							 | 
						||
| 
								 | 
							
								    var server;
							 | 
						||
| 
								 | 
							
								    var proxy;
							 | 
						||
| 
								 | 
							
								    var agent;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    server = http.createServer(function(req, res) {
							 | 
						||
| 
								 | 
							
								      tunnel.debug('SERVER: got request');
							 | 
						||
| 
								 | 
							
								      ++serverConnect;
							 | 
						||
| 
								 | 
							
								      res.writeHead(200);
							 | 
						||
| 
								 | 
							
								      res.end('Hello' + req.url);
							 | 
						||
| 
								 | 
							
								      tunnel.debug('SERVER: sending response');
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    server.listen(serverPort, setupProxy);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function setupProxy() {
							 | 
						||
| 
								 | 
							
								      proxy = http.createServer(function(req, res) {
							 | 
						||
| 
								 | 
							
								        should.fail();
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      proxy.on('upgrade', onConnect); // for v0.6
							 | 
						||
| 
								 | 
							
								      proxy.on('connect', onConnect); // for v0.7 or later
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      function onConnect(req, clientSocket, head) {
							 | 
						||
| 
								 | 
							
								        tunnel.debug('PROXY: got CONNECT request');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        req.method.should.equal('CONNECT');
							 | 
						||
| 
								 | 
							
								        req.url.should.equal('localhost:' + serverPort);
							 | 
						||
| 
								 | 
							
								        req.headers.should.not.have.property('transfer-encoding');
							 | 
						||
| 
								 | 
							
								        req.headers.should.have.property('proxy-authorization',
							 | 
						||
| 
								 | 
							
								            'Basic ' + new Buffer('user:password').toString('base64'));
							 | 
						||
| 
								 | 
							
								        ++proxyConnect;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								        tunnel.debug('PROXY: creating a tunnel');
							 | 
						||
| 
								 | 
							
								        var serverSocket = net.connect(serverPort, function() {
							 | 
						||
| 
								 | 
							
								          tunnel.debug('PROXY: replying to client CONNECT request');
							 | 
						||
| 
								 | 
							
								          clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n');
							 | 
						||
| 
								 | 
							
								          clientSocket.pipe(serverSocket);
							 | 
						||
| 
								 | 
							
								          serverSocket.write(head);
							 | 
						||
| 
								 | 
							
								          serverSocket.pipe(clientSocket);
							 | 
						||
| 
								 | 
							
								          // workaround, see joyent/node#2524
							 | 
						||
| 
								 | 
							
								          serverSocket.on('end', function() {
							 | 
						||
| 
								 | 
							
								            clientSocket.end();
							 | 
						||
| 
								 | 
							
								          });
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      proxy.listen(proxyPort, setupClient);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function setupClient() {
							 | 
						||
| 
								 | 
							
								      agent = tunnel.httpOverHttp({
							 | 
						||
| 
								 | 
							
								        maxSockets: poolSize,
							 | 
						||
| 
								 | 
							
								        proxy: {
							 | 
						||
| 
								 | 
							
								          port: proxyPort,
							 | 
						||
| 
								 | 
							
								          proxyAuth: 'user:password'
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      for (var i = 0; i < N; ++i) {
							 | 
						||
| 
								 | 
							
								        doClientRequest(i);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      function doClientRequest(i) {
							 | 
						||
| 
								 | 
							
								        tunnel.debug('CLIENT: Making HTTP request (%d)', i);
							 | 
						||
| 
								 | 
							
								        var req = http.get({
							 | 
						||
| 
								 | 
							
								          port: serverPort,
							 | 
						||
| 
								 | 
							
								          path: '/' + i,
							 | 
						||
| 
								 | 
							
								          agent: agent
							 | 
						||
| 
								 | 
							
								        }, function(res) {
							 | 
						||
| 
								 | 
							
								          tunnel.debug('CLIENT: got HTTP response (%d)', i);
							 | 
						||
| 
								 | 
							
								          res.setEncoding('utf8');
							 | 
						||
| 
								 | 
							
								          res.on('data', function(data) {
							 | 
						||
| 
								 | 
							
								            data.should.equal('Hello/' + i);
							 | 
						||
| 
								 | 
							
								          });
							 | 
						||
| 
								 | 
							
								          res.on('end', function() {
							 | 
						||
| 
								 | 
							
								            ++clientConnect;
							 | 
						||
| 
								 | 
							
								            if (clientConnect === N) {
							 | 
						||
| 
								 | 
							
								              proxy.close();
							 | 
						||
| 
								 | 
							
								              server.close();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          });
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    server.on('close', function() {
							 | 
						||
| 
								 | 
							
								      serverConnect.should.equal(N);
							 | 
						||
| 
								 | 
							
								      proxyConnect.should.equal(poolSize);
							 | 
						||
| 
								 | 
							
								      clientConnect.should.equal(N);
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								      agent.sockets.should.be.empty;
							 | 
						||
| 
								 | 
							
								      agent.requests.should.be.empty;
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								      done();
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |