| 'use strict'; |
| const common = require('../common'); |
| |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| // This test verifies the behavior of the tls setSecureContext() method. |
| // It also verifies that existing connections are not disrupted when the |
| // secure context is changed. |
| |
| const assert = require('assert'); |
| const https = require('https'); |
| const fixtures = require('../common/fixtures'); |
| const credentialOptions = [ |
| { |
| key: fixtures.readKey('agent1-key.pem'), |
| cert: fixtures.readKey('agent1-cert.pem'), |
| ca: fixtures.readKey('ca1-cert.pem') |
| }, |
| { |
| key: fixtures.readKey('agent2-key.pem'), |
| cert: fixtures.readKey('agent2-cert.pem'), |
| ca: fixtures.readKey('ca2-cert.pem') |
| } |
| ]; |
| let firstResponse; |
| |
| const server = https.createServer(credentialOptions[0], (req, res) => { |
| const id = +req.headers.id; |
| |
| if (id === 1) { |
| firstResponse = res; |
| firstResponse.write('multi-'); |
| return; |
| } else if (id === 4) { |
| firstResponse.write('success-'); |
| } |
| |
| res.end('success'); |
| }); |
| |
| server.listen(0, common.mustCall(() => { |
| const { port } = server.address(); |
| const firstRequest = makeRequest(port, 1); |
| |
| async function makeRemainingRequests() { |
| // Wait until the first request is guaranteed to have been handled. |
| if (!firstResponse) { |
| return setImmediate(makeRemainingRequests); |
| } |
| |
| assert.strictEqual(await makeRequest(port, 2), 'success'); |
| |
| server.setSecureContext(credentialOptions[1]); |
| firstResponse.write('request-'); |
| await assert.rejects(async () => { |
| await makeRequest(port, 3); |
| }, /^Error: self signed certificate$/); |
| |
| server.setSecureContext(credentialOptions[0]); |
| assert.strictEqual(await makeRequest(port, 4), 'success'); |
| |
| server.setSecureContext(credentialOptions[1]); |
| firstResponse.end('fun!'); |
| await assert.rejects(async () => { |
| await makeRequest(port, 5); |
| }, /^Error: self signed certificate$/); |
| |
| assert.strictEqual(await firstRequest, 'multi-request-success-fun!'); |
| server.close(); |
| } |
| |
| makeRemainingRequests(); |
| })); |
| |
| function makeRequest(port, id) { |
| return new Promise((resolve, reject) => { |
| const options = { |
| rejectUnauthorized: true, |
| ca: credentialOptions[0].ca, |
| servername: 'agent1', |
| headers: { id } |
| }; |
| |
| https.get(`https://localhost:${port}`, options, (res) => { |
| let response = ''; |
| |
| res.setEncoding('utf8'); |
| |
| res.on('data', (chunk) => { |
| response += chunk; |
| }); |
| |
| res.on('end', common.mustCall(() => { |
| resolve(response); |
| })); |
| }).on('error', (err) => { |
| reject(err); |
| }); |
| }); |
| } |