| 'use strict'; |
| |
| const common = require('../common'); |
| const assert = require('assert'); |
| const { createHook } = require('async_hooks'); |
| const http = require('http'); |
| |
| // Verify that resource emitted for an HTTPParser is not reused. |
| // Verify that correct create/destroy events are emitted. |
| |
| const reused = Symbol('reused'); |
| |
| const reusedParser = []; |
| const incomingMessageParser = []; |
| const clientRequestParser = []; |
| const dupDestroys = []; |
| const destroyed = []; |
| |
| createHook({ |
| init(asyncId, type, triggerAsyncId, resource) { |
| switch (type) { |
| case 'HTTPINCOMINGMESSAGE': |
| incomingMessageParser.push(asyncId); |
| break; |
| case 'HTTPCLIENTREQUEST': |
| clientRequestParser.push(asyncId); |
| break; |
| } |
| |
| if (resource[reused]) { |
| reusedParser.push( |
| `resource reused: ${asyncId}, ${triggerAsyncId}, ${type}` |
| ); |
| } |
| resource[reused] = true; |
| }, |
| destroy(asyncId) { |
| if (destroyed.includes(asyncId)) { |
| dupDestroys.push(asyncId); |
| } else { |
| destroyed.push(asyncId); |
| } |
| } |
| }).enable(); |
| |
| const server = http.createServer((req, res) => { |
| res.end(); |
| }); |
| |
| server.listen(0, common.mustCall(() => { |
| const PORT = server.address().port; |
| const url = `http://127.0.0.1:${PORT}`; |
| http.get(url, common.mustCall(() => { |
| server.close(common.mustCall(() => { |
| server.listen(PORT, common.mustCall(() => { |
| http.get(url, common.mustCall(() => { |
| server.close(common.mustCall(() => { |
| setTimeout(common.mustCall(verify), 200); |
| })); |
| })); |
| })); |
| })); |
| })); |
| })); |
| |
| function verify() { |
| assert.strictEqual(reusedParser.length, 0); |
| |
| assert.strictEqual(incomingMessageParser.length, 2); |
| assert.strictEqual(clientRequestParser.length, 2); |
| |
| assert.strictEqual(dupDestroys.length, 0); |
| incomingMessageParser.forEach((id) => assert.ok(destroyed.includes(id))); |
| clientRequestParser.forEach((id) => assert.ok(destroyed.includes(id))); |
| } |