109 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			3.2 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(); | ||
|  |     }); | ||
|  |   }); | ||
|  | }); |