@@ -9,7 +9,9 @@ if (!common.hasCrypto) |
9 | 9 | // secure context is changed. |
10 | 10 |
|
11 | 11 | const assert = require('assert'); |
| 12 | +const events = require('events'); |
12 | 13 | const https = require('https'); |
| 14 | +const timers = require('timers/promises'); |
13 | 15 | const fixtures = require('../common/fixtures'); |
14 | 16 | const credentialOptions = [ |
15 | 17 | { |
@@ -43,10 +45,10 @@ server.listen(0, common.mustCall(() => { |
43 | 45 | const { port } = server.address(); |
44 | 46 | const firstRequest = makeRequest(port, 1); |
45 | 47 |
|
46 | | - async function makeRemainingRequests() { |
| 48 | + (async function makeRemainingRequests() { |
47 | 49 | // Wait until the first request is guaranteed to have been handled. |
48 | | - if (!firstResponse) { |
49 | | - return setImmediate(makeRemainingRequests); |
| 50 | + while (!firstResponse) { |
| 51 | + await timers.setImmediate(); |
50 | 52 | } |
51 | 53 |
|
52 | 54 | assert.strictEqual(await makeRequest(port, 2), 'success'); |
@@ -56,53 +58,38 @@ server.listen(0, common.mustCall(() => { |
56 | 58 | const errorMessageRegex = common.hasOpenSSL3 ? |
57 | 59 | /^Error: self-signed certificate$/ : |
58 | 60 | /^Error: self signed certificate$/; |
59 | | - await assert.rejects(async () => { |
60 | | - await makeRequest(port, 3); |
61 | | - }, errorMessageRegex); |
| 61 | + await assert.rejects(makeRequest(port, 3), errorMessageRegex); |
62 | 62 |
|
63 | 63 | server.setSecureContext(credentialOptions[0]); |
64 | 64 | assert.strictEqual(await makeRequest(port, 4), 'success'); |
65 | 65 |
|
66 | 66 | server.setSecureContext(credentialOptions[1]); |
67 | 67 | firstResponse.end('fun!'); |
68 | | - await assert.rejects(async () => { |
69 | | - await makeRequest(port, 5); |
70 | | - }, errorMessageRegex); |
| 68 | + await assert.rejects(makeRequest(port, 5), errorMessageRegex); |
71 | 69 |
|
72 | 70 | assert.strictEqual(await firstRequest, 'multi-request-success-fun!'); |
73 | 71 | server.close(); |
74 | | - } |
75 | | - |
76 | | - makeRemainingRequests(); |
| 72 | + })().then(common.mustCall()); |
77 | 73 | })); |
78 | 74 |
|
79 | | -function makeRequest(port, id) { |
80 | | - return new Promise((resolve, reject) => { |
81 | | - const options = { |
82 | | - rejectUnauthorized: true, |
83 | | - ca: credentialOptions[0].ca, |
84 | | - servername: 'agent1', |
85 | | - headers: { id } |
86 | | - }; |
87 | | - |
88 | | - let errored = false; |
89 | | - https.get(`https://localhost:${port}`, options, (res) => { |
90 | | - let response = ''; |
91 | | - |
92 | | - res.setEncoding('utf8'); |
93 | | - |
94 | | - res.on('data', (chunk) => { |
95 | | - response += chunk; |
96 | | - }); |
97 | | - |
98 | | - res.on('end', common.mustCall(() => { |
99 | | - resolve(response); |
100 | | - })); |
101 | | - }).on('error', (err) => { |
102 | | - errored = true; |
103 | | - reject(err); |
104 | | - }).on('finish', () => { |
105 | | - assert.strictEqual(errored, false); |
106 | | - }); |
107 | | - }); |
| 75 | +async function makeRequest(port, id) { |
| 76 | + const options = { |
| 77 | + rejectUnauthorized: true, |
| 78 | + ca: credentialOptions[0].ca, |
| 79 | + servername: 'agent1', |
| 80 | + headers: { id }, |
| 81 | + agent: new https.Agent() |
| 82 | + }; |
| 83 | + |
| 84 | + const req = https.get(`https://localhost:${port}`, options); |
| 85 | + |
| 86 | + let errored = false; |
| 87 | + req.on('error', () => errored = true); |
| 88 | + req.on('finish', () => assert.strictEqual(errored, false)); |
| 89 | + |
| 90 | + const [res] = await events.once(req, 'response'); |
| 91 | + res.setEncoding('utf8'); |
| 92 | + let response = ''; |
| 93 | + for await (const chunk of res) response += chunk; |
| 94 | + return response; |
108 | 95 | } |