Skip to content

Commit ee29c56

Browse files
panvaaduh95
authored andcommitted
test: prevent parser reuse across close scenarios
Both cases replace parser cleanup methods. Faster socket cleanup can return a modified parser to the shared pool and close it before the other request uses it. Run the immediate and deferred close cases in separate test files so each gets its own process and parser pool. Preserve both cleanup paths and all call-count assertions. Signed-off-by: Filip Skokan <panva.ip@gmail.com> Assisted-by: Codex PR-URL: #66017 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Xuguang Mei <meixuguang@gmail.com> Reviewed-By: Ulises Gascón <ulisesgascongonzalez@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
1 parent 8a27474 commit ee29c56

2 files changed

Lines changed: 45 additions & 32 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const http = require('http');
5+
6+
// Keep this case in a separate process from the immediate-close case so
7+
// their modified parsers cannot be reused across cases.
8+
9+
function request(server) {
10+
http.get({
11+
agent: false,
12+
port: server.address().port,
13+
path: '/',
14+
}, (res) => {
15+
res.resume();
16+
});
17+
}
18+
19+
const server = http.createServer(common.mustCallAtLeast((req, res) => {
20+
// See `freeParser` in _http_common.js
21+
const { parser } = req.socket;
22+
parser.free = common.mustCall(() => {
23+
setImmediate(common.mustCall(() => {
24+
parser.close();
25+
}));
26+
});
27+
req.socket.on('close', common.mustCall(() => {
28+
setImmediate(common.mustCall(() => {
29+
server.close();
30+
}));
31+
}));
32+
res.end('ok');
33+
})).listen(0, common.mustCall(() => {
34+
request(server);
35+
}));

test/parallel/test-http-server-connection-list-when-close.js

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,36 +13,14 @@ function request(server) {
1313
});
1414
}
1515

16-
{
17-
const server = http.createServer(common.mustCallAtLeast((req, res) => {
18-
// Hack to not remove parser out of server.connectionList
19-
// See `freeParser` in _http_common.js
20-
req.socket.parser.free = common.mustCall();
21-
req.socket.on('close', common.mustCall(() => {
22-
server.close();
23-
}));
24-
res.end('ok');
25-
})).listen(0, common.mustCall(() => {
26-
request(server);
16+
const server = http.createServer(common.mustCallAtLeast((req, res) => {
17+
// Hack to not remove parser out of server.connectionList
18+
// See `freeParser` in _http_common.js
19+
req.socket.parser.free = common.mustCall();
20+
req.socket.on('close', common.mustCall(() => {
21+
server.close();
2722
}));
28-
}
29-
30-
{
31-
const server = http.createServer(common.mustCallAtLeast((req, res) => {
32-
// See `freeParser` in _http_common.js
33-
const { parser } = req.socket;
34-
parser.free = common.mustCall(() => {
35-
setImmediate(common.mustCall(() => {
36-
parser.close();
37-
}));
38-
});
39-
req.socket.on('close', common.mustCall(() => {
40-
setImmediate(common.mustCall(() => {
41-
server.close();
42-
}));
43-
}));
44-
res.end('ok');
45-
})).listen(0, common.mustCall(() => {
46-
request(server);
47-
}));
48-
}
23+
res.end('ok');
24+
})).listen(0, common.mustCall(() => {
25+
request(server);
26+
}));

0 commit comments

Comments
 (0)