Skip to content

Commit da0788d

Browse files
lpincaMayaLekova
authored andcommitted
http: free the parser before emitting 'upgrade'
Ensure that the parser is freed before emitting the 'connect' or 'upgrade' event. PR-URL: nodejs#18209 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Jon Moss <[email protected]> Reviewed-By: Fedor Indutny <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]>
1 parent 5ac5a7a commit da0788d

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

lib/_http_client.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ function socketOnData(d) {
420420
socket.removeListener('data', socketOnData);
421421
socket.removeListener('end', socketOnEnd);
422422
parser.finish();
423+
freeParser(parser, req, socket);
423424

424425
var bodyHead = d.slice(bytesParsed, d.length);
425426

@@ -440,7 +441,6 @@ function socketOnData(d) {
440441
// Got Upgrade header or CONNECT method, but have no handler.
441442
socket.destroy();
442443
}
443-
freeParser(parser, req, socket);
444444
} else if (parser.incoming && parser.incoming.complete &&
445445
// When the status code is 100 (Continue), the server will
446446
// send a final response after this client sends a request
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const http = require('http');
6+
7+
const server = http.createServer();
8+
9+
server.on('upgrade', common.mustCall((request, socket) => {
10+
assert.strictEqual(socket.parser, null);
11+
socket.write([
12+
'HTTP/1.1 101 Switching Protocols',
13+
'Connection: Upgrade',
14+
'Upgrade: WebSocket',
15+
'\r\n'
16+
].join('\r\n'));
17+
}));
18+
19+
server.listen(common.mustCall(() => {
20+
const request = http.get({
21+
port: server.address().port,
22+
headers: {
23+
Connection: 'Upgrade',
24+
Upgrade: 'WebSocket'
25+
}
26+
});
27+
28+
request.on('upgrade', common.mustCall((response, socket) => {
29+
assert.strictEqual(socket.parser, null);
30+
socket.destroy();
31+
server.close();
32+
}));
33+
}));

0 commit comments

Comments
 (0)