UNPKG

2.96 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
13describe('HTTPS over HTTP', function() {
14 it('should finish without error', function(done) {
15 var serverPort = 3004;
16 var proxyPort = 3005;
17 var poolSize = 3;
18 var N = 10;
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 = http.createServer(function(req, res) {
37 should.fail();
38 });
39 proxy.on('connect', function(req, clientSocket, head) {
40 req.method.should.equal('CONNECT');
41 req.url.should.equal('localhost:' + serverPort);
42 ++proxyConnect;
43
44 var serverSocket = net.connect(serverPort, function() {
45 clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n');
46 clientSocket.pipe(serverSocket);
47 serverSocket.write(head);
48 serverSocket.pipe(clientSocket);
49 // workaround, see joyent/node#2524
50 serverSocket.on('end', function() {
51 clientSocket.end();
52 });
53 });
54 });
55 proxy.listen(proxyPort, function() {
56 agent = tunnel.httpsOverHttp({
57 maxSockets: poolSize,
58 // client certification for origin server
59 key: readPem('agent1-key'),
60 cert: readPem('agent1-cert'),
61 proxy: {
62 port: proxyPort
63 }
64 });
65
66 for (var i = 0; i < N; ++i) {
67 (function(i) {
68 var req = https.get({
69 port: serverPort,
70 path: '/' + i,
71 agent: agent
72 }, function(res) {
73 res.setEncoding('utf8');
74 res.on('data', function(data) {
75 data.should.equal('Hello/' + i);
76 });
77 res.on('end', function() {
78 ++clientConnect;
79 if (clientConnect === N) {
80 proxy.close();
81 server.close();
82 }
83 });
84 });
85 })(i);
86 }
87 });
88 });
89
90 server.on('close', function() {
91 serverConnect.should.equal(N);
92 proxyConnect.should.equal(poolSize);
93 clientConnect.should.equal(N);
94
95 var name = 'localhost:' + serverPort;
96 agent.sockets.should.not.have.ownProperty(name);
97 agent.requests.should.not.have.ownProperty(name);
98
99 done();
100 });
101 });
102});