aboutsummaryrefslogtreecommitdiff
path: root/node_modules/tunnel/test/http-over-http.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/tunnel/test/http-over-http.js')
-rw-r--r--node_modules/tunnel/test/http-over-http.js108
1 files changed, 108 insertions, 0 deletions
diff --git a/node_modules/tunnel/test/http-over-http.js b/node_modules/tunnel/test/http-over-http.js
new file mode 100644
index 0000000..73d17a2
--- /dev/null
+++ b/node_modules/tunnel/test/http-over-http.js
@@ -0,0 +1,108 @@
+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();
+ });
+ });
+});