UNPKG

3.92 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 HTTPS authentication failed', function() {
14 it('should finish without error', function(done) {
15 var serverPort = 3008;
16 var proxyPort = 3009;
17 var serverConnect = 0;
18 var proxyConnect = 0;
19 var clientConnect = 0;
20 var clientError = 0;
21
22 var server = https.createServer({
23 key: readPem('agent2-key'),
24 cert: readPem('agent2-cert'),
25 ca: [ readPem('ca1-cert') ], // ca for agent1
26 requestCert: true,
27 rejectUnauthorized: true
28 }, function(req, res) {
29 ++serverConnect;
30 res.writeHead(200);
31 res.end('Hello, ' + serverConnect);
32 });
33 server.listen(serverPort, function() {
34 var proxy = https.createServer({
35 key: readPem('agent4-key'),
36 cert: readPem('agent4-cert'),
37 ca: [ readPem('ca2-cert') ], // ca for agent3
38 requestCert: true,
39 rejectUnauthorized: true
40 }, function(req, res) {
41 should.fail();
42 });
43 proxy.on('connect', function(req, clientSocket, head) {
44 req.method.should.equal('CONNECT');
45 req.url.should.equal('localhost:' + serverPort);
46 ++proxyConnect;
47
48 var serverSocket = net.connect(serverPort, function() {
49 clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n');
50 clientSocket.pipe(serverSocket);
51 serverSocket.write(head);
52 serverSocket.pipe(clientSocket);
53 // workaround, see #2524
54 serverSocket.on('end', function() {
55 clientSocket.end();
56 });
57 });
58 });
59 proxy.listen(proxyPort, function() {
60 function doRequest(options) {
61 var agent = tunnel.httpsOverHttps(options);
62 var req = https.get({
63 port: serverPort,
64 agent: agent
65 }, function(res) {
66 ++clientConnect;
67 req.emit('finish');
68 });
69 req.on('error', function(err) {
70 ++clientError;
71 req.emit('finish');
72 });
73 req.on('finish', function() {
74 if (clientConnect + clientError === 4) {
75 proxy.close();
76 server.close();
77 }
78 });
79 }
80
81 doRequest({ // invalid
82 maxSockets: 1,
83 // no certificate for origin server
84 proxy: {
85 port: proxyPort
86 // no certificate for proxy
87 }
88 });
89 doRequest({ // invalid
90 maxSockets: 1,
91 // client certification for origin server
92 key: readPem('agent1-key'),
93 cert: readPem('agent1-cert'),
94 proxy: {
95 port: proxyPort
96 // no certificate for proxy
97 }
98 });
99 doRequest({ // invalid
100 maxSockets: 1,
101 // no certificate for origin server
102 proxy: {
103 port: proxyPort,
104 // client certification for proxy
105 key: readPem('agent3-key'),
106 cert: readPem('agent3-cert')
107 }
108 });
109 doRequest({ // valid
110 maxSockets: 1,
111 // client certification for origin server
112 key: readPem('agent1-key'),
113 cert: readPem('agent1-cert'),
114 proxy: {
115 port: proxyPort,
116 // client certification for proxy
117 key: readPem('agent3-key'),
118 cert: readPem('agent3-cert')
119 }
120 });
121 });
122 });
123
124 server.on('close', function() {
125 serverConnect.should.equal(1);
126 proxyConnect.should.equal(2);
127 clientConnect.should.equal(1);
128 clientError.should.equal(3);
129
130 done();
131 });
132 });
133});