Skip to content

Commit 1d88266

Browse files
lpincaMylesBorins
authored andcommitted
http: free the parser before emitting 'upgrade'
Ensure that the parser is freed before emitting the 'connect' or 'upgrade' event. PR-URL: #18209 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Jon Moss <me@jonathanmoss.me> Reviewed-By: Fedor Indutny <fedor.indutny@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
1 parent e0e0ef7 commit 1d88266

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

lib/_http_client.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ function socketOnData(d) {
453453
socket.removeListener('data', socketOnData);
454454
socket.removeListener('end', socketOnEnd);
455455
parser.finish();
456+
freeParser(parser, req, socket);
456457

457458
var bodyHead = d.slice(bytesParsed, d.length);
458459

@@ -475,7 +476,6 @@ function socketOnData(d) {
475476
// Got Upgrade header or CONNECT method, but have no handler.
476477
socket.destroy();
477478
}
478-
freeParser(parser, req, socket);
479479
} else if (parser.incoming && parser.incoming.complete &&
480480
// When the status code is 100 (Continue), the server will
481481
// send a final response after this client sends a request
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)