UNPKG

3.31 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.js');
8
9function readPem(file) {
10 return fs.readFileSync(path.join('test/keys', file + '.pem'));
11}
12
13describe('HTTPS over HTTPS', function() {
14 it('should finish without error', function(done) {
15 var serverPort = 3006;
16 var proxyPort = 3007;
17 var poolSize = 3;
18 var N = 5;
19 var serverConnect = 0;
20 var proxyConnect = 0;
21 var clientConnect = 0;
22 var agent;
23
24 var server = https.createServer({
25 key: readPem('agent2-key'),
26 cert: readPem('agent2-cert'),
27 ca: [readPem('ca1-cert')], // ca for agent1
28 requestCert: true,
29 rejectUnauthorized: true
30 }, function(req, res) {
31 ++serverConnect;
32 res.writeHead(200);
33 res.end('Hello' + req.url);
34 });
35 server.listen(serverPort, function() {
36 var proxy = https.createServer({
37 key: readPem('agent4-key'),
38 cert: readPem('agent4-cert'),
39 ca: [readPem('ca2-cert')], // ca for agent3
40 requestCert: true,
41 rejectUnauthorized: true
42 }, function(req, res) {
43 should.fail();
44 });
45 proxy.on('connect', function(req, clientSocket, head) {
46 req.method.should.equal('CONNECT');
47 req.url.should.equal('localhost:' + serverPort);
48 ++proxyConnect;
49
50 var serverSocket = net.connect(serverPort, function() {
51 clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n');
52 clientSocket.pipe(serverSocket);
53 serverSocket.write(head);
54 serverSocket.pipe(clientSocket);
55 // workaround, see joyent/node#2524
56 serverSocket.on('end', function() {
57 clientSocket.end();
58 });
59 });
60 });
61 proxy.listen(proxyPort, function() {
62 agent = tunnel.httpsOverHttps({
63 maxSockets: poolSize,
64 // client certification for origin server
65 key: readPem('agent1-key'),
66 cert: readPem('agent1-cert'),
67 proxy: {
68 port: proxyPort,
69 // client certification for proxy
70 key: readPem('agent3-key'),
71 cert: readPem('agent3-cert')
72 }
73 });
74
75 for (var i = 0; i < N; ++i) {
76 (function(i) {
77 var req = https.get({
78 port: serverPort,
79 path: '/' + i,
80 agent: agent
81 }, function(res) {
82 res.setEncoding('utf8');
83 res.on('data', function(data) {
84 data.should.equal('Hello/' + i);
85 });
86 res.on('end', function() {
87 ++clientConnect;
88 if (clientConnect === N) {
89 proxy.close();
90 server.close();
91 }
92 });
93 });
94 })(i);
95 }
96 });
97 });
98
99 server.on('close', function() {
100 serverConnect.should.equal(N);
101 proxyConnect.should.equal(poolSize);
102 clientConnect.should.equal(N);
103
104 var name = 'localhost:' + serverPort;
105 agent.sockets.should.not.have.ownProperty(name);
106 agent.requests.should.not.have.ownProperty(name);
107
108 done();
109 });
110 });
111});