@@ -4,6 +4,10 @@ const common = require('../common'); |
4 | 4 | if (!common.hasCrypto) |
5 | 5 | common.skip('missing crypto'); |
6 | 6 |
|
| 7 | +// This test verifies the behavior of the tls setSecureContext() method. |
| 8 | +// It also verifies that existing connections are not disrupted when the |
| 9 | +// secure context is changed. |
| 10 | + |
7 | 11 | const assert = require('assert'); |
8 | 12 | const https = require('https'); |
9 | 13 | const fixtures = require('../common/fixtures'); |
@@ -19,54 +23,63 @@ const credentialOptions = [ |
19 | 23 | ca: fixtures.readKey('ca2-cert.pem') |
20 | 24 | } |
21 | 25 | ]; |
22 | | -let requestsCount = 0; |
23 | 26 | let firstResponse; |
24 | 27 |
|
25 | 28 | const server = https.createServer(credentialOptions[0], (req, res) => { |
26 | | - requestsCount++; |
| 29 | + const id = +req.headers.id; |
27 | 30 |
|
28 | | - if (requestsCount === 1) { |
| 31 | + if (id === 1) { |
29 | 32 | firstResponse = res; |
30 | 33 | firstResponse.write('multi-'); |
31 | 34 | return; |
32 | | - } else if (requestsCount === 3) { |
| 35 | + } else if (id === 4) { |
33 | 36 | firstResponse.write('success-'); |
34 | 37 | } |
35 | 38 |
|
36 | 39 | res.end('success'); |
37 | 40 | }); |
38 | 41 |
|
39 | | -server.listen(0, common.mustCall(async () => { |
| 42 | +server.listen(0, common.mustCall(() => { |
40 | 43 | const { port } = server.address(); |
41 | | - const firstRequest = makeRequest(port); |
| 44 | + const firstRequest = makeRequest(port, 1); |
| 45 | + |
| 46 | + async function makeRemainingRequests() { |
| 47 | + // Wait until the first request is guaranteed to have been handled. |
| 48 | + if (!firstResponse) { |
| 49 | + return setImmediate(makeRemainingRequests); |
| 50 | + } |
42 | 51 |
|
43 | | - assert.strictEqual(await makeRequest(port), 'success'); |
| 52 | + assert.strictEqual(await makeRequest(port, 2), 'success'); |
44 | 53 |
|
45 | | - server.setSecureContext(credentialOptions[1]); |
46 | | - firstResponse.write('request-'); |
47 | | - await assert.rejects(async () => { |
48 | | - await makeRequest(port); |
49 | | - }, /^Error: self signed certificate$/); |
| 54 | + server.setSecureContext(credentialOptions[1]); |
| 55 | + firstResponse.write('request-'); |
| 56 | + await assert.rejects(async () => { |
| 57 | + await makeRequest(port, 3); |
| 58 | + }, /^Error: self signed certificate$/); |
50 | 59 |
|
51 | | - server.setSecureContext(credentialOptions[0]); |
52 | | - assert.strictEqual(await makeRequest(port), 'success'); |
| 60 | + server.setSecureContext(credentialOptions[0]); |
| 61 | + assert.strictEqual(await makeRequest(port, 4), 'success'); |
53 | 62 |
|
54 | | - server.setSecureContext(credentialOptions[1]); |
55 | | - firstResponse.end('fun!'); |
56 | | - await assert.rejects(async () => { |
57 | | - await makeRequest(port); |
58 | | - }, /^Error: self signed certificate$/); |
| 63 | + server.setSecureContext(credentialOptions[1]); |
| 64 | + firstResponse.end('fun!'); |
| 65 | + await assert.rejects(async () => { |
| 66 | + await makeRequest(port, 5); |
| 67 | + }, /^Error: self signed certificate$/); |
| 68 | + |
| 69 | + assert.strictEqual(await firstRequest, 'multi-request-success-fun!'); |
| 70 | + server.close(); |
| 71 | + } |
59 | 72 |
|
60 | | - assert.strictEqual(await firstRequest, 'multi-request-success-fun!'); |
61 | | - server.close(); |
| 73 | + makeRemainingRequests(); |
62 | 74 | })); |
63 | 75 |
|
64 | | -function makeRequest(port) { |
| 76 | +function makeRequest(port, id) { |
65 | 77 | return new Promise((resolve, reject) => { |
66 | 78 | const options = { |
67 | 79 | rejectUnauthorized: true, |
68 | 80 | ca: credentialOptions[0].ca, |
69 | | - servername: 'agent1' |
| 81 | + servername: 'agent1', |
| 82 | + headers: { id } |
70 | 83 | }; |
71 | 84 |
|
72 | 85 | https.get(`https://localhost:${port}`, options, (res) => { |
|