UNPKG

3.62 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 serverKey = readPem('server1-key');
14var serverCert = readPem('server1-cert');
15var serverCA = readPem('ca1-cert');
16var clientKey = readPem('client1-key');
17var clientCert = readPem('client1-cert');
18var clientCA = readPem('ca3-cert');
19
20
21describe('HTTPS over HTTP', function() {
22 it('should finish without error', function(done) {
23 var serverPort = 3002;
24 var proxyPort = 3003;
25 var poolSize = 3;
26 var N = 10;
27 var serverConnect = 0;
28 var proxyConnect = 0;
29 var clientConnect = 0;
30 var server;
31 var proxy;
32 var agent;
33
34 server = https.createServer({
35 key: serverKey,
36 cert: serverCert,
37 ca: [clientCA],
38 requestCert: true,
39 rejectUnauthorized: true
40 }, function(req, res) {
41 tunnel.debug('SERVER: got request');
42 ++serverConnect;
43 res.writeHead(200);
44 res.end('Hello' + req.url);
45 tunnel.debug('SERVER: sending response');
46 });
47 server.listen(serverPort, setupProxy);
48
49 function setupProxy() {
50 proxy = http.createServer(function(req, res) {
51 should.fail();
52 });
53 proxy.on('upgrade', onConnect); // for v0.6
54 proxy.on('connect', onConnect); // for v0.7 or later
55
56 function onConnect(req, clientSocket, head) {
57 tunnel.debug('PROXY: got CONNECT request');
58
59 req.method.should.equal('CONNECT');
60 req.url.should.equal('localhost:' + serverPort);
61 req.headers.should.not.have.property('transfer-encoding');
62 ++proxyConnect;
63
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.httpsOverHttp({
81 maxSockets: poolSize,
82 key: clientKey,
83 cert: clientCert,
84 ca: [serverCA],
85 rejectUnauthorized: true,
86 proxy: {
87 port: proxyPort
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 HTTPS request (%d)', i);
97 var req = https.get({
98 port: serverPort,
99 path: '/' + i,
100 agent: agent
101 }, function(res) {
102 tunnel.debug('CLIENT: got HTTPS 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});