Skip to content

Commit 5c5bd22

Browse files
authored
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 efc612d commit 5c5bd22

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)