UNPKG

3.67 kBJavaScriptView Raw
1var http = require('http');
2var https = require('https');
3var net = require('net');
4var fs = require('fs');
5var path = require('path');
6var should = require('should');
7var tunnel = require('../index');
8
9function readPem(file) {
10 return fs.readFileSync(path.join('test/keys', file + '.pem'));
11}
12
13var proxyKey = readPem('proxy1-key');
14var proxyCert = readPem('proxy1-cert');
15var proxyCA = readPem('ca2-cert');
16var clientKey = readPem('client1-key');
17var clientCert = readPem('client1-cert');
18var clientCA = readPem('ca3-cert');
19
20describe('HTTP over HTTPS', function() {
21 it('should finish without error', function(done) {
22 var serverPort = 3004;
23 var proxyPort = 3005;
24 var poolSize = 3;
25 var N = 10;
26 var serverConnect = 0;
27 var proxyConnect = 0;
28 var clientConnect = 0;
29 var server;
30 var proxy;
31 var agent;
32
33 server = http.createServer(function(req, res) {
34 tunnel.debug('SERVER: got request');
35 ++serverConnect;
36 res.writeHead(200);
37 res.end('Hello' + req.url);
38 tunnel.debug('SERVER: sending response');
39 });
40 server.listen(serverPort, setupProxy);
41
42 function setupProxy() {
43 proxy = https.createServer({
44 key: proxyKey,
45 cert: proxyCert,
46 ca: [clientCA],
47 requestCert: true,
48 rejectUnauthorized: true
49 }, function(req, res) {
50 should.fail();
51 });
52 proxy.on('upgrade', onConnect); // for v0.6
53 proxy.on('connect', onConnect); // for v0.7 or later
54
55 function onConnect(req, clientSocket, head) {
56 tunnel.debug('PROXY: got CONNECT request');
57
58 req.method.should.equal('CONNECT');
59 req.url.should.equal('localhost:' + serverPort);
60 req.headers.should.not.have.property('transfer-encoding');
61 ++proxyConnect;
62
63 tunnel.debug('PROXY: creating a tunnel');
64 var serverSocket = net.connect(serverPort, function() {
65 tunnel.debug('PROXY: replying to client CONNECT request');
66 clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n');
67 clientSocket.pipe(serverSocket);
68 serverSocket.write(head);
69 serverSocket.pipe(clientSocket);
70 // workaround, see joyent/node#2524
71 serverSocket.on('end', function() {
72 clientSocket.end();
73 });
74 });
75 }
76 proxy.listen(proxyPort, setupClient);
77 }
78
79 function setupClient() {
80 agent = tunnel.httpOverHttps({
81 maxSockets: poolSize,
82 proxy: {
83 port: proxyPort,
84 key: clientKey,
85 cert: clientCert,
86 ca: [proxyCA],
87 rejectUnauthorized: true
88 }
89 });
90
91 for (var i = 0; i < N; ++i) {
92 doClientRequest(i);
93 }
94
95 function doClientRequest(i) {
96 tunnel.debug('CLIENT: Making HTTP request (%d)', i);
97 var req = http.get({
98 port: serverPort,
99 path: '/' + i,
100 agent: agent
101 }, function(res) {
102 tunnel.debug('CLIENT: got HTTP response (%d)', i);
103 res.setEncoding('utf8');
104 res.on('data', function(data) {
105 data.should.equal('Hello/' + i);
106 });
107 res.on('end', function() {
108 ++clientConnect;
109 if (clientConnect === N) {
110 proxy.close();
111 server.close();
112 }
113 });
114 });
115 }
116 }
117
118 server.on('close', function() {
119 serverConnect.should.equal(N);
120 proxyConnect.should.equal(poolSize);
121 clientConnect.should.equal(N);
122
123 var name = 'localhost:' + serverPort;
124 agent.sockets.should.be.empty;
125 agent.requests.should.be.empty;
126
127 done();
128 });
129 });
130});